Una forma de recorrer (cerrar) automáticamente todas las sesiones de pantalla

Una forma de recorrer (cerrar) automáticamente todas las sesiones de pantalla

Con frecuencia uso la pantalla cuando inicio sesión en los nodos interactivos de una supercomputadora a la que tengo acceso, y a menudo ejecuto cosas y sigo adelante. Hay alrededor de 20 nodos separados en los que puedo iniciar sesión; y si marco cualquiera de ellos, tendré algo así como 4 sesiones independientes. Cada una de esas sesiones tendrá quizás 5 sesiones de pantalla dentro de eso.

¿Existe una manera rápida de recorrer todos estos y cerrarlos si no están ejecutando ningún proceso? Mi proceso actual es screen -lsy screen -r ####luego escribir exithasta volver a la pantalla base.

EDITAR

Aquí hay un guión que basé en la respuesta 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

Cuando lo ejecuto con kill, parece que no pasa nada con las sesiones. Cuando ejecuto quit, parece cerrar toda la sesión y todo lo que se ejecuta dentro (sin verificar si hay procesos en ejecución). ¿Ajustes desde aquí?

Respuesta1

Una opción es ejecutar los programas como el comando principal de la pantalla, luego la pantalla se cerrará cuando terminen.

Si lo anterior no es útil, puede estimar cuántos procesos se están ejecutando observando cuántos están conectados a los shells tty.

Se necesitan un par de modismos.

Extraer el pid de pantalla de screen -ls:

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

Busque quién tiene ese pid como padre:

ps h --ppid $screen_pid -o tty

Vea cuántos procesos están conectados a ese tty:

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

Poniendolo todo junto

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

información relacionada