En una situación de usuario único, si tomamos el ejemplo de xterm
, simplemente podemos contar el número de pids de xterm
; xterm
crea un pid separado para cada ventana.
gnome-terminal
Sin embargo, ejecuta un solo pid, pero la buena noticia es que crea un proceso hijo para cada ventana y / o pestaña. Podemos recuperar estos procesos secundarios mediante el comando:
pgrep -P <pid_of_gnome-terminal>
Sin embargo, hay algunas complicaciones con las que lidiar:
Leyendo su pregunta, podemos suponer que el usuario en este caso es en realidad el propietario de la sesión x . Por lo general, simplemente podemos usar la $USER
variable-, pero esto podría no coincidir con el usuario actualmente conectado $DISPLAY
.
En una situación multiusuario, los pids que pertenecen a la aplicación de terminal (o cuál) no necesariamente pertenecen a la actual $DISPLAY
. Necesitamos separar solo los pids relevantes y los pids secundarios.
En Unity (15.10 o inferior), si un segundo usuario inicia sesión, se inicia un proceso adicional ( gnome-pty-helper
), que aparece como un proceso secundario gnome-terminal
, pero el proceso (obviamente) no tiene una ventana o pestaña. En Mate , el proceso existe de todos modos.
En breve
Para contar el número de pestañas y / o ventanas de una aplicación de terminal, necesitamos:
- Vea si ejecutamos una aplicación de terminal que tiene múltiples pids o un solo pid en uno
$DISPLAY
(sesión x)
- De los procesos en ejecución, separe solo los pids relevantes, ejecutándose en este
$DISPLAY
- Si la aplicación ejecuta procesos secundarios para su pid (para ventanas / pestañas), vea si se
gnome-pty-helper
ejecuta, para corregir el número.
Sin embargo, esto puede ser programado para encontrar de manera confiable el número de ventanas y pestañas abiertas actualmente.
La secuencia de comandos
En el siguiente script, la aplicación de terminal de destino se utiliza como argumento . El script funciona en muchas terminales en las que lo probé. Una excepción es Tilda
en este momento.
Un ejemplo
- Tengo dos usuarios conectados, uno (no el actual) con dos
gnome-terminal
ventanas, uno (el que está en la imagen) con tres gnome-terminal
ventanas y dos xterm
ventanas.
El comando:
/path/to/get_terms.sh gnome-terminal
salidas:
3
mientras
/path/to/get_terms.sh xterm
salidas:
2
La secuencia de comandos
#!/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
Usar
Copie el script en un archivo vacío, guárdelo como get_terms.sh
, hágalo ejecutable y ejecútelo con el comando:
/path/to/get_terms.sh <terminal_application>
tty
. Supongo que nosotros / otros nos hemos concentrado demasiado en esa "pregunta" y olvidamos que podría haber otras soluciones para toda la "necesidad" :) Incluso jugaría con la implementación de un selector de color aleatorio. Si son 256 colores, la selección de colores iguales / similares no debería suceder mucho. Sin embargo, la configuración manual de colores para los números de puntos dados dará una mejor personalización.