Uma maneira de auto ciclo (fechar) através de todas as sessões de tela

2

Freqüentemente, uso a tela quando faço logon nos nós interativos em um supercomputador ao qual tenho acesso - e geralmente executo as coisas e segui em frente. Existem cerca de 20 nós separados nos quais eu posso efetuar login; e se eu verificar qualquer um deles, terei algo como 4 sessões separadas. Cada uma dessas sessões terá talvez 5 sessões de tela dentro disso.

Existe uma maneira rápida de percorrer todas essas etapas e fechá-las se não estiverem executando nenhum processo? Meu processo atual é screen -ls e, em seguida, screen -r #### , em seguida, digite exit até voltar à tela inicial.

EDITAR

Aqui está um script que eu baseei na resposta de Thor:

for screen_pid in $(screen -ls | sed -nr 's/^\t+([0-9]+).*//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 executo com kill, nada parece acontecer com as sessões. Quando eu corro com quit, parece matar toda a sessão e qualquer coisa que esteja dentro (sem verificar se há processos em execução). Tweaks daqui?

    
por JBWhitmore 30.09.2012 / 08:17

1 resposta

2

Uma opção é executar os programas como o comando principal da tela e, em seguida, a tela sairá quando eles forem concluídos.

Se o acima não for útil, você pode estimar quantos processos estão sendo executados observando quantos estão conectados ao shells tty.

São necessários alguns idiomas

Extraia o pid da tela de screen -ls :

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

Pesquisa que tem esse pid como pai:

ps h --ppid $screen_pid -o tty

Veja quantos processos estão conectados a essa tty:

ps a -o tty | grep $shell_tty | wc -l

Juntando tudo

screen -ls | sed -nr 's/^\t+([0-9]+).*//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
    
por 30.09.2012 / 10:41