%20autom%C3%A1ticamente%20todas%20las%20sesiones%20de%20pantalla.png)
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 -ls
y screen -r ####
luego escribir exit
hasta 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