Uma maneira de percorrer automaticamente (fechar) todas as sessões de tela

Uma maneira de percorrer automaticamente (fechar) todas as sessões de tela

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 -lsdigitar screen -r ####até exitvoltar à 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

informação relacionada