У єдиній ситуації з користувачем, якщо ми беремо приклад xterm
, ми можемо просто підрахувати кількість підписів xterm
; xterm
створює окремий під для кожного вікна.
gnome-terminal
однак запускає один під, але гарна новина полягає в тому, що він створює дочірній процес для кожного вікна та / або вкладки. ми можемо отримати ці дочірні процеси за допомогою команди:
pgrep -P <pid_of_gnome-terminal>
Однак є кілька ускладнень, які можна вирішити:
Читаючи ваше запитання, ми можемо припустити, що користувач у цьому випадку насправді є власником x-сеансу . Зазвичай ми можемо просто використовувати $USER
-variable, але це може не відповідати поточно зареєстрованому користувачеві $DISPLAY
.
У багатокористувацькій ситуації підси, що належать до (або якої) термінальної програми, не обов'язково належать до поточного $DISPLAY
. Нам потрібно розділити лише відповідні піди та підручники.
У Unity (15.10 або новішої версії), якщо другий користувач входить у систему, запускається додатковий процес ( gnome-pty-helper
), який відображається як дочірній процес gnome-terminal
, але процес (очевидно) не має вікна або вкладки. Що стосується Mate , процес все одно існує.
Коротко
Для підрахунку кількості вкладок та / або вікон термінальної програми нам потрібно:
- Подивіться, чи ми запускаємо термінальну програму, яка містить декілька підписів або один під на одному
$DISPLAY
(x-сесія)
- Від запущених процесів відокремте лише відповідні піди, які працюють на цьому
$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 кольорів, вибір однакових / подібних кольорів не повинен відбуватися багато. Однак налаштування кольорів вручну для заданих номерів очок дасть кращу персоналізацію.