В случае одного пользователя, если мы возьмем пример xterm
, мы можем просто посчитать количество пид xterm
; xterm
создает отдельный pid для каждого окна.
gnome-terminal
однако запускается один pid, но хорошая новость заключается в том, что он создает дочерний процесс для каждого окна и / или вкладки. мы можем получить эти дочерние процессы командой:
pgrep -P <pid_of_gnome-terminal>
Однако есть несколько сложностей, с которыми нужно иметь дело:
Читая ваш вопрос, мы можем предположить, что пользователь в этом случае фактически является владельцем x-сессии . Обычно мы можем просто использовать $USER
-variable, но это может не совпадать с текущим вошедшим пользователем $DISPLAY
.
В многопользовательской ситуации pids, принадлежащие (или какому) терминальному приложению, не обязательно принадлежат текущему $DISPLAY
. Нам нужно разделить только соответствующие pids и child-pids.
В Unity (15.10 или ниже), если второй пользователь входит в систему, запускается дополнительный процесс ( gnome-pty-helper
), который выглядит как дочерний процесс gnome-terminal
, но у процесса (очевидно) нет окна или вкладки. На Мате , процесс все равно существует.
Короче говоря
Для подсчета количества вкладок и / или окон терминального приложения нам необходимо:
- Посмотрим, запустим ли мы терминальное приложение, в котором несколько пидов или один пид на одном
$DISPLAY
(x-session)
- Из запущенных процессов, отделяю только соответствующие пиды, работающие на этом
$DISPLAY
- Если приложение выполняет дочерние процессы для своего pid (для окон / вкладок), посмотрите,
gnome-pty-helper
работает ли , чтобы исправить число.
Это может быть очень хорошо написано, однако, чтобы надежно найти количество в настоящее время открытых окон и / или вкладок.
Сценарий
В приведенном ниже сценарии целевое терминальное приложение используется в качестве аргумента . Скрипт работает на многих терминалах, на которых я его тестировал. Исключение Tilda
в этот момент.
Пример
- У меня есть два пользователя, вошедших в систему, один (не текущий) с двумя
gnome-terminal
окнами, один (тот, что на картинке) с тремя gnome-terminal
окнами и два xterm
окна.
Команда:
/path/to/get_terms.sh gnome-terminal
выходы:
3
пока
/path/to/get_terms.sh xterm
выходы:
2
Сценарий
#!/bin/bash
terminal=$1
# get the user running the current x-session
username=$(who | grep $DISPLAY | head -1 | awk '{print $1}')
# get the pid of the terminal for the current user
userpid=$(pgrep -u $username $terminal)
# check what type the terminal is (multi pid/single pid)
npids="$(echo "$userpid" | wc -w)"
# in case of a single pid, count the children
if [ "$npids" -eq 1 ]; then
# check if gnome-pty-helper runs (starts when multiple users are logged in)
ptpid=$(pgrep gnome-pty-helpe)
# get number of child- procs
let "orig = $( pgrep -P $(pgrep -u $username $terminal) | wc -w )"
# if pty-helper runs, correct the number of child procs
if [ -n "$ptpid" ] && [ -n "$userpid" ]; then
let "n_terms = $orig-1"; else let "n_terms = $orig"
fi
# if no child procs run, n-terminals = n-counted pids (difference Mate <> Unity)
if [ "$n_terms" -eq 0 ]; then echo $orig; else echo $n_terms; fi
# in case of multiple pids, count the pids
elif [ "$npids" -gt 1 ]; then echo $npids
fi
Использовать
Скопируйте скрипт в пустой файл, сохраните его как get_terms.sh
, сделайте его исполняемым и запустите его командой:
/path/to/get_terms.sh <terminal_application>
tty
. Я думаю, что мы / другие слишком сконцентрировались на этом "вопросе" и забыли, что могут быть другие решения для всей "потребности" :) Я бы даже поиграл с реализацией случайного селектора цвета. Если это 256 цветов, выбор одинаковых / похожих цветов не должен произойти много. Однако ручная настройка цветов для заданных номеров очков даст лучшую персонализацию.