In einer Einzelbenutzersituation können wir am Beispiel xterm
einfach die Anzahl der Pids von zählen xterm
; xterm
Erstellt für jedes Fenster eine eigene PID.
gnome-terminal
Es wird jedoch eine einzelne PID ausgeführt. Die gute Nachricht ist jedoch, dass für jedes Fenster und / oder jede Registerkarte ein untergeordneter Prozess erstellt wird. Wir können diese untergeordneten Prozesse mit dem folgenden Befehl abrufen:
pgrep -P <pid_of_gnome-terminal>
Es gibt jedoch einige Komplikationen:
Wenn Sie Ihre Frage lesen, können wir davon ausgehen, dass der Benutzer in diesem Fall tatsächlich Eigentümer der x-Sitzung ist . Normalerweise können wir einfach die $USER
-variable verwenden, aber dies stimmt möglicherweise nicht mit dem aktuell angemeldeten Benutzer von überein $DISPLAY
.
In einer Mehrbenutzersituation gehören Pids, die zur (entweder welche) Terminalanwendung gehören, nicht unbedingt zum aktuellen $DISPLAY
. Wir müssen nur die relevanten Pids und Child-Pids aufteilen.
Wenn sich in Unity (15.10 oder niedriger) ein zweiter Benutzer anmeldet, wird ein zusätzlicher Prozess gestartet ( gnome-pty-helper
), der als untergeordneter Prozess angezeigt wird gnome-terminal
, aber der Prozess hat (offensichtlich) kein Fenster oder keine Registerkarte. Auf Mate existiert der Prozess trotzdem.
Zusamenfassend
Um die Anzahl der Registerkarten und / oder Fenster einer Terminalanwendung zu zählen, müssen wir:
- Überprüfen Sie, ob wir eine Terminalanwendung ausführen, die mehrere Pids oder eine einzelne PID auf einer hat
$DISPLAY
(x-Sitzung).
- Teilen Sie von den laufenden Prozessen nur die relevanten Pids ab, die auf diesem ausgeführt werden
$DISPLAY
- Wenn die Anwendung untergeordnete Prozesse für ihre PID ausführt (für Fenster / Registerkarten), überprüfen Sie, ob sie ausgeführt
gnome-pty-helper
wird, um die Nummer zu korrigieren.
Dies kann jedoch sehr gut per Skript ausgeführt werden, um die Anzahl der aktuell geöffneten Fenster und / oder Registerkarten zuverlässig zu ermitteln.
Das Skript
Im folgenden Skript wird die Zielterminalanwendung als Argument verwendet . Das Skript funktioniert auf vielen Terminals, auf denen ich es getestet habe. Eine Ausnahme ist Tilda
in diesem Moment.
Ein Beispiel
- Ich habe zwei Benutzer angemeldet, einen (nicht den aktuellen) mit zwei
gnome-terminal
Fenstern, einen (den im Bild) mit drei gnome-terminal
Fenstern und zwei xterm
Fenster.
Der Befehl:
/path/to/get_terms.sh gnome-terminal
Ausgänge:
3
während
/path/to/get_terms.sh xterm
Ausgänge:
2
Das Skript
#!/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
Benutzen
Kopieren Sie das Skript in eine leere Datei, speichern Sie es unter get_terms.sh
, machen Sie es ausführbar und führen Sie es mit dem folgenden Befehl aus:
/path/to/get_terms.sh <terminal_application>
tty
. Ich denke, wir / andere haben uns zu sehr auf diese "Frage" konzentriert und vergessen, dass es andere Lösungen für das gesamte "Bedürfnis" geben könnte :) Ich würde sogar mit der Implementierung einer zufälligen Farbauswahl spielen. Wenn es 256 Farben sind, sollte die Auswahl derselben / ähnlicher Farben nicht viel passieren. Das manuelle Einstellen der Farben für bestimmte Punktnummern führt jedoch zu einer besseren Personalisierung.