Я часто использую экран, когда я вхожу в интерактивные узлы на суперкомпьютере, к которому у меня есть доступ - и я часто запускаю вещи и двигаюсь дальше. Есть около 20 отдельных узлов, в которые я могу войти; и если я проверю любой из них, у меня будет что-то вроде 4 отдельных сеансов. Каждая из этих сессий будет состоять из 5 экранных сессий.
Есть ли быстрый способ перебрать все это и закрыть их, если они не запускают какие-либо процессы? Мой текущий процесс состоит в том, чтобы screen -ls
и затем screen -r ####
затем набирать команду exit
пока я не вернусь к базовому экрану.
РЕДАКТИРОВАТЬ
Вот сценарий, который я основал на ответе Тора:
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
Когда я запускаю его с kill, кажется, ничего не происходит с сессиями. Когда я запускаю с quit, кажется, что он завершает весь сеанс и все, что выполняется внутри (без проверки, запущены ли процессы). Твики отсюда?