Способ автоматического переключения между всеми сеансами экрана (закрытия)

Способ автоматического переключения между всеми сеансами экрана (закрытия)

Я часто использую 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

Связанный контент