.png)
Я часто использую screen, когда вхожу в интерактивные узлы суперкомпьютера, к которому у меня есть доступ, и я часто запускаю что-то и иду дальше. Есть около 20 отдельных узлов, в которые я могу войти; и если я проверю любой из них, у меня будет что-то вроде 4 отдельных сеансов. Каждый из этих сеансов будет иметь, возможно, 5 сеансов screen.
Есть ли быстрый способ циклически проходить по всем этим и закрывать их, если они не запускают никаких процессов? Мой текущий процесс — это 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, он, похоже, убивает весь сеанс и все, что работает внутри (не проверяя, есть ли запущенные процессы). Настройки отсюда?
решение1
Одним из вариантов является запуск программ в качестве основной команды screen, после чего screen завершит работу.
Если вышеизложенное не помогает, вы можете оценить количество запущенных процессов, посмотрев, сколько из них подключено к tty оболочки.
Нужны несколько идиом
Извлечь pid экрана из screen -ls
:
screen -ls | sed -nr 's/^\t+([0-9]+).*/\1/p'
Поиск того, у кого этот pid является родителем:
ps h --ppid $screen_pid -o tty
Посмотрите, сколько процессов подключено к этому tty:
ps a -o tty | grep $shell_tty | wc -l
Собираем все вместе
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