%20aller%20Bildschirmsitzungen.png)
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 -ls
und 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