Как определить количество открытых терминалов пользователем
Я использую Ubuntu и могу вручную изменить bash
оболочка подскажет цвет к зеленому
export PS1="\e[0;32m[\u@\h \W]\$ \e[m"
Однако я хочу, чтобы цвет приглашения оболочки автоматически менялся при открытии нового терминала или вкладки. Я знаю, что основной TTY TERM имеет 16 цветов, и это нормально, чтобы повернуть цвета, если открыто более 16 терминалов. Будет ли решение также работать при подключении через Putty
, tmux
или же screen
,
Моя идея написать сценарий оболочки и поместить его в .bashrc
который обнаруживает новый сеанс терминала, который открыл пользователь, и увеличивает глобальный счетчик с \e[0;31m[
в \e[0;47m[
, Как определить количество открытых терминалов пользователем?
4 ответа
Если вам действительно нужно получить номер открытого терминала, перейдите к подсчету принадлежащих вам файлов в разделе /dev/pts
(хотя это могут быть те, которые открываются фоновыми процессами, а не графическими эмуляторами терминала). В качестве альтернативы подсчитайте количество дочерних процессов вашего эмулятора (ов) терминала, как показано Джейкобом в первой строке его ответа.
Избегайте полагаться на who
выходной, и ищу gnome-pty-helper
процессы, так как они не работают в более новых gnome-terminal
версии.
Обратите внимание, что в настоящее время почти все графические эмуляторы терминала (включая putty) и мультиплексоры (screen, tmux) поддерживают 256 цветов. Вы можете получить действительно красивые цветные подсказки, если используете эту палитру.
Моя рекомендация для очень простого решения состоит в том, чтобы основывать цвет на текущем номере линии tty. Например, обработать вывод tty
команда, чтобы взять только номер и получить цвет от этого. Определенный номер строки tty дается только одному терминалу за раз, вам нужно сначала закрыть этот терминал, прежде чем ядро выдаст тот же номер строки. Это, в сочетании с 256 цветами, автоматически гарантирует, что вы не увидите один и тот же цвет дважды в данный момент времени (и даже с 16 цветами это даст довольно равномерное распределение). Нет необходимости в ведении глобального счетчика, и нет необходимости в подсчете терминалов или процессов.
В однопользовательской ситуации, если мы возьмем пример 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
(Х-сессия) - Из запущенных процессов, отделяю только соответствующие пиды, работающие на этом
$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>
awk
путь:
who | awk 'BEGIN{count=0}{ if(NR!=1){count++} }END{print count}'
Объяснение:
В приведенной выше 1 команде лайнера, awk
используется для определения количества терминалов. внутри awk
Программа, это просто проверка количества строк, возвращаемых командой who - 1.
Простой способ может быть также просто запустить System Monitor
(если запущен из терминала, вы должны написать gnome-system-monitor
) и на вкладке "Процессы" упорядочить запущенные процессы по имени, а затем подсчитать количество вхождений Bash
в списке (они будут все вместе, если вы организуете по имени, так что это легко сосчитать).
Обратите внимание, что вы должны искать Bash
и не для Gnome Terminal
если вы хотите увидеть количество открытых терминалов по пользователю. После того, как вы откроете терминал Gnome Terminal
также появится в списке процессов, но останется только один, даже если открыто больше терминалов. Кнопка "Просмотр" в System Monitor
позволяет установить, какие процессы видеть, например. Все процессы / Пользовательские процессы / Активные...