W sytuacji jednego użytkownika, jeśli weźmiemy przykład xterm
, możemy po prostu policzyć liczbę pid xterm
; xterm
tworzy osobny pid dla każdego okna.
gnome-terminal
uruchamia jednak pojedynczy pid, ale dobrą wiadomością jest to, że tworzy proces potomny dla każdego okna i / lub karty. możemy pobrać te procesy potomne za pomocą polecenia:
pgrep -P <pid_of_gnome-terminal>
Istnieje jednak kilka komplikacji:
Czytając twoje pytanie, możemy założyć, że użytkownik w tym przypadku jest faktycznie właścicielem sesji x . Zwykle możemy po prostu użyć opcji $USER
-variable, ale może to nie pasować do aktualnie zalogowanego użytkownika $DISPLAY
.
W sytuacji wielu użytkowników pidy należące do (której) aplikacji terminalowej niekoniecznie należą do bieżącej $DISPLAY
. Musimy oddzielić tylko odpowiednie pids i pids dla dzieci.
W Unity (15.10 lub niższej), jeśli zaloguje się drugi użytkownik, uruchamiany jest dodatkowy proces ( gnome-pty-helper
), który pojawia się jako proces potomny gnome-terminal
, ale proces (oczywiście) nie ma okna ani karty. Na Mate proces i tak istnieje.
W skrócie
Aby policzyć liczbę kart i / lub okien aplikacji terminalowej, musimy:
- Sprawdź, czy uruchamiamy aplikację terminalową, która ma wiele pidów lub jeden pid na jednej
$DISPLAY
(sesja x)
- Z uruchomionych procesów oddzielić tylko odpowiednie stawki, działając na tym
$DISPLAY
- Jeśli aplikacja uruchamia procesy potomne dla swojego identyfikatora pid (dla systemu Windows / kart), sprawdź, czy
gnome-pty-helper
działa, aby poprawić liczbę.
Można to jednak dobrze napisać w skrypcie, aby niezawodnie znaleźć liczbę aktualnie otwartych okien i / lub kart.
Scenariusz
W poniższym skrypcie jako argument używana jest docelowa aplikacja terminalowa . Skrypt działa na wielu terminalach, na których go testowałem. W Tilda
tej chwili jest wyjątek .
Przykład
- Mam zalogowanych dwóch użytkowników, jeden (nie bieżący) z dwoma
gnome-terminal
oknami, jeden (jeden na obrazku) z trzema gnome-terminal
oknami i dwoma xterm
oknami.
Komenda:
/path/to/get_terms.sh gnome-terminal
wyjścia:
3
podczas
/path/to/get_terms.sh xterm
wyjścia:
2
Scenariusz
#!/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
Używać
Skopiuj skrypt do pustego pliku, zapisz go jako get_terms.sh
, wykonaj go i uruchom za pomocą polecenia:
/path/to/get_terms.sh <terminal_application>
tty
. Myślę, że my / inni zbytnio skoncentrowaliśmy się na tym „pytaniu” i zapomnieliśmy, że mogą istnieć inne rozwiązania dla całej „potrzeby” :) Bawiłbym się nawet implementacją losowego wyboru koloru. Jeśli jest to 256 kolorów, wybranie takich samych / podobnych kolorów nie powinno się zdarzyć dużo. Jednak ręczne ustawienie kolorów dla danych liczb pts zapewni lepszą personalizację.