Em uma situação de usuário único, se tomarmos o exemplo de xterm
, podemos simplesmente contar o número de pids de xterm
; xterm
cria um pid separado para cada janela.
gnome-terminal
no entanto executa um único pid, mas a boa notícia é que ele cria um processo filho para cada janela e / ou guia. podemos recuperar esses processos filhos pelo comando:
pgrep -P <pid_of_gnome-terminal>
Existem no entanto algumas complicações para lidar com:
-
Lendo sua pergunta, podemos supor que usuário neste caso é realmente proprietário da sessão x . Normalmente, podemos simplesmente usar o $USER
-variable, mas isso pode não corresponder ao usuário atualmente conectado de $DISPLAY
.
-
Em uma situação multiusuário, os pids pertencentes ao (qual) aplicativo de terminal não pertencem necessariamente ao atual $DISPLAY
. Precisamos dividir apenas os pids e child-pids relevantes.
-
No Unity (15.10 ou inferior), se um segundo usuário efetuar login, será iniciado um processo adicional ( gnome-pty-helper
), que aparece como um processo filho em gnome-terminal
, mas o processo (obviamente) tem sem janela ou aba. Em Mate , o processo existe mesmo assim.
Em suma
Para contar o número de guias e / ou janelas de um aplicativo de terminal, precisamos:
- Veja se executamos um aplicativo de terminal que possui vários pids ou um único pid em um
$DISPLAY
(x-session)
- A partir dos processos em execução, divida somente os pids relevantes, em execução neste
$DISPLAY
- Se o aplicativo executar processos-filhos para seu pid (para janelas / guias), veja se
gnome-pty-helper
é executado para corrigir o número.
Isso pode muito bem ser roteirizado, no entanto, para encontrar com segurança o número de janelas e / ou abas atualmente abertas.
O script
No script abaixo, o aplicativo terminal direcionado é usado como um argumento . O script funciona em muitos terminais nos quais testei. Uma exceção é Tilda
neste momento.
Um exemplo
- Eu tenho dois usuários conectados, um (não o atual) com duas
gnome-terminal
windows, um (o da imagem) com três gnome-terminal
windows e dois xterm
windows.
O comando:
/path/to/get_terms.sh gnome-terminal
saídas:
3
enquanto
/path/to/get_terms.sh xterm
saídas:
2
O script
#!/bin/bash
terminal=
# get the user running the current x-session
username=$(who | grep $DISPLAY | head -1 | awk '{print }')
# 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
Para usar
-
Copie o script em um arquivo vazio, salve-o como get_terms.sh
, torne-o executável e execute-o pelo comando:
/path/to/get_terms.sh <terminal_application>