Как обнаружить количество открытых терминалов пользователем

Я использую Ubuntu и могу вручную измениться bash цвет приглашения оболочки к зеленому использованию

export PS1="\e[0;32m[\u@\h \W]\$ \e[m" 

Однако я хочу, чтобы цвет приглашения оболочки автоматически изменился каждый раз, когда я открываю новый терминал или вкладку. Я знаю, что основной ТЕРМИН tty имеет 16 цветов, и он должен хорошо повернуть цвета, если больше чем 16 терминалов открыты. Будет решение также работать, когда я соединюсь через Putty, tmux или screen.

Моя идея состоит в том, чтобы записать сценарий оболочки и поместить его в .bashrc который обнаруживает новый терминальный сеанс, пользователь открыл и увеличивает глобальный счетчик от \e[0;31m[ кому: \e[0;47m[. Как обнаружить количество открытых терминалов пользователем?

9
задан 1 June 2016 в 10:15

4 ответа

Если действительно необходимо получить количество терминала, Вы имеете открытый, пойдите для подсчета файлов, принадлежавших Вам под /dev/pts (хотя это могло бы включать, открытые фоновыми процессами, не эмуляторами графического терминала). С другой стороны, считайте количество дочерних процессов Вашего эмулятора (эмуляторов) терминала, как показано Jacob в первой строке его ответа.

Постарайтесь не полагаться whoвывод и поиск gnome-pty-helper процессы, так как они не работают в более новом gnome-terminal версии.

Обратите внимание, что в наше время в значительной степени все эмуляторы графического терминала (включая шпаклевку) и мультиплексоры (экран, tmux) поддерживают 256 цветов. Можно получить действительно хорошие цветные подсказки при использовании этой палитры.

Моя рекомендация для очень простого решения состоит в том, чтобы основывать цвет на числе текущей tty строки. Например, обработайте вывод tty управляйте, чтобы взять число только и получить цвет из этого. Определенный tty номер строки только дан одному терминалу за один раз, необходимо было бы закрыть тот терминал сначала, прежде чем тот же номер строки будет переиздан ядром. Это, объединенное с 256 цветами, автоматически гарантирует, что Вы не будете видеть того же цвета дважды в установленный срок (и даже с 16 цветами он дал бы довольно ровное распределение). Никакая потребность в поддержании глобального счетчика и никакой потребности в подсчете терминалов или процессов.

8
ответ дан 23 November 2019 в 04:55

В ситуации отдельного пользователя, если мы берем пример xterm, мы можем просто считать количество pids xterm; xterm создает отдельный pid для каждого окна.
gnome-terminal однако выполняет единственный pid, но хорошие новости - то, что он создает дочерний процесс для каждого окна и/или вкладки. мы можем получить эти дочерние процессы командой:

pgrep -P <pid_of_gnome-terminal>

Существует однако несколько сложностей для контакта с:

  • Читая Ваш вопрос, мы можем принять, тот пользователь в этом случае является на самом деле владельцем x-сессии. Обычно мы можем просто использовать $USER - переменная, но это не могло бы соответствовать, в настоящее время входил в систему пользователь $DISPLAY.

  • В многопользовательской ситуации, pids принадлежащий (также, который) терминальное приложение, не обязательно принадлежат току $DISPLAY. Мы должны отделить только соответствующий pids и ребенка-pids.

  • На Единице (15.10 или ниже), если второй пользователь входит в систему, запускается дополнительный процесс (gnome-pty-helper), который появляется как дочерний процесс в gnome-terminal, но процесс (очевидно), не имеет никакого окна или вкладки. На Помощнике процесс существует так или иначе.

Короче говоря

Для подсчета количества вкладок и/или окон терминального приложения мы должны:

  • Посмотрите, запускаем ли мы терминальное приложение, которое имеет несколько pids или единственный pid на одном $DISPLAY (x-сессия)
  • От рабочих процессов, отделенных только соответствующий pids, работая на этом $DISPLAY
  • Если дочерние процессы выполнения приложения для его pid (для окон/вкладок), посмотрите если gnome-pty-helper выполнения, для исправления числа.

Это может очень хорошо быть задано сценарием однако, для надежного нахождения количества в настоящее время открываемых окон и/или вкладок.

Сценарий

В сценарии ниже, целенаправленное терминальное приложение используется в качестве аргумента. Сценарий работает над многими терминалами, на которых я протестировал его. Исключение Tilda в данный момент.

Пример

  • У меня есть два зарегистрированные пользователя, один (не ток) с два gnome-terminal окна, одно (то в изображении) с три gnome-terminal окна, и два xterm окна.

enter image description here

Команда:

/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>
    
5
ответ дан 23 November 2019 в 04:55

awk путь:

who | awk 'BEGIN{count=0}{ if(NR!=1){count++} }END{print count}'

Объяснение:

В вышеупомянутой 1 команде лайнера, awk используется для нахождения количества терминала. Внутри awk программа, это просто проверяет количество возврата строк, кто управляет - 1.

1
ответ дан 23 November 2019 в 04:55

Простой путь может быть также только для выполнения System Monitor (если запущено с Терминала необходимо записать gnome-system-monitor) и под "Processes" вкладка располагают рабочие процессы по имени и, чем количество количество случаев Bash в списке (они будут всеми вместе, если Вы расположите по имени, таким образом, легко рассчитать).

Обратите внимание, что необходимо искать Bash а не для Gnome Terminal если Вы хотите видеть количество открытых терминалов пользователем. После того как Вы открываете Terminal Gnome Terminal также появится в списке Процессов, но останется только одним, даже если будет открыто больше Терминалов. Кнопка "View" в System Monitor позволяет Вам устанавливать который процессы видеть, например, Все Процессы Процессов/Пользователя / Активный...

0
ответ дан 23 November 2019 в 04:55

Другие вопросы по тегам:

Похожие вопросы: