%20todas%20as%20sess%C3%B5es%20de%20tela.png)
Freqüentemente uso a tela quando faço login nos nós interativos de um supercomputador ao qual tenho acesso - e frequentemente executo coisas e sigo em frente. Existem cerca de 20 nós separados nos quais posso fazer login; e se eu marcar qualquer um deles terei algo em torno de 4 sessões separadas. Cada uma dessas sessões terá talvez 5 sessões de tela.
Existe uma maneira rápida de percorrer tudo isso e fechá-los se não estiverem executando nenhum processo? Meu processo atual é screen -ls
digitar screen -r ####
até exit
voltar à tela inicial.
EDITAR
Aqui está um script que baseei na resposta de Thor:
for screen_pid in $(screen -ls | sed -nr 's/^\t+([0-9]+).*/\1/p');
do
for shell_tty in $(ps h --ppid $screen_pid -o tty);
do
number_of_processes=$(ps a -o tty | grep $shell_tty | wc -l)
if (( number_of_processes > 1 )); then
echo number $number_of_processes
else
# screen -S $screen_pid -X kill
screen -S $screen_pid -X quit
fi
done
done
Quando executo kill, nada parece acontecer nas sessões. Quando executo quit, parece encerrar toda a sessão e qualquer coisa em execução dentro dela (sem verificar se há processos em execução). Ajustes daqui?
Responder1
Uma opção é executar os programas como o comando primário da tela e, em seguida, a tela será encerrada quando terminar.
Se o acima não for útil, você pode estimar quantos processos estão em execução observando quantos estão conectados aos shells tty.
São necessárias algumas expressões idiomáticas
Extraia o pid da tela de screen -ls
:
screen -ls | sed -nr 's/^\t+([0-9]+).*/\1/p'
Pesquise quem tem esse pid como pai:
ps h --ppid $screen_pid -o tty
Veja quantos processos estão conectados a esse tty:
ps a -o tty | grep $shell_tty | wc -l
Juntando tudo
screen -ls | sed -nr 's/^\t+([0-9]+).*/\1/p' | while read screen_pid; do
shell_tty=$(ps h --ppid $screen_pid -o tty)
number_of_processes=$(ps a -o tty | grep $shell_tty | wc -l)
if (( number_of_processes > 1 )); then
# more than the shell is running
else
# can be killed
fi
done