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


2

Costumo usar a tela quando faço logon nos nós interativos em um supercomputador ao qual tenho acesso - e costumo executar as coisas e seguir em frente. Existem cerca de 20 nós separados nos quais posso fazer login; e se eu verificar algum deles, terei algo como 4 sessões desanexadas. Cada uma dessas sessões terá talvez 5 sessões de tela dentro disso.

Existe uma maneira rápida de percorrer tudo isso e fechá-lo se eles não estiverem executando nenhum processo? Meu processo atual é screen -lse, em seguida screen -r ####, digite exitaté voltar à tela base.

EDITAR

Aqui está um script que eu 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 eu corro com kill, nada parece acontecer com as sessões. Quando eu corro com quit, parece matar toda a sessão e qualquer coisa em execução dentro (sem verificar se há processos em execução). Ajustes a partir daqui?


1
Usar Ctrl-dpara sair o aceleraria.
Thor

Respostas:


2

Uma opção é executar os programas como o comando principal da tela e, em seguida, a tela será encerrada quando terminar.

Se o exposto 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ários alguns idiomas

Extrair o pid da tela de screen -ls:

screen -ls | sed -nr 's/^\t+([0-9]+).*/\1/p'

Pesquisa 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

Eu o modifiquei um pouco para poder acompanhar um pouco o que estava acontecendo no seu script. Coloquei a questão em EDIT, porque a formatação tornou impossível aqui.
fácil
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.