Eine Möglichkeit zum automatischen Durchlaufen (Schließen) aller Bildschirmsitzungen

Eine Möglichkeit zum automatischen Durchlaufen (Schließen) aller Bildschirmsitzungen

Ich verwende häufig screen, wenn ich mich bei den interaktiven Knoten eines Supercomputers anmelde, auf den ich Zugriff habe – und ich führe häufig Dinge aus und gehe weiter. Es gibt ungefähr 20 separate Knoten, bei denen ich mich anmelden kann; und wenn ich einen davon ankreuze, habe ich ungefähr 4 getrennte Sitzungen. Jede dieser Sitzungen enthält möglicherweise 5 Bildschirmsitzungen.

Gibt es eine schnelle Möglichkeit, alle diese Vorgänge zu durchlaufen und zu schließen, wenn keine Prozesse ausgeführt werden? Mein aktueller Vorgang besteht darin, sie zu bestätigen screen -lsund screen -r ####dann zu tippen exit, bis ich wieder beim Basisbildschirm bin.

BEARBEITEN

Hier ist ein Skript, das ich auf Thors Antwort basiert:

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

Wenn ich es mit kill ausführe, scheint mit den Sitzungen nichts zu passieren. Wenn ich es mit quit ausführe, scheint es die gesamte Sitzung und alles, was darin läuft, zu beenden (ohne zu prüfen, ob Prozesse laufen). Gibt es von hier aus Optimierungen?

Antwort1

Eine Möglichkeit besteht darin, die Programme als primären Bildschirmbefehl auszuführen. Bildschirm wird dann beendet, wenn sie fertig sind.

Wenn die oben genannten Angaben nicht hilfreich sind, können Sie die Anzahl der laufenden Prozesse schätzen, indem Sie sich ansehen, wie viele mit dem TTY der Shell verbunden sind.

Ein paar Redewendungen sind nötig

Extrahieren Sie die Bildschirm-PID aus screen -ls:

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

Suchen Sie, wer diese PID als übergeordnetes Element hat:

ps h --ppid $screen_pid -o tty

Sehen Sie, wie viele Prozesse mit diesem TTY verbunden sind:

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

Alles zusammenfügen

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

verwandte Informationen