2

Я часто использую экран, когда я вхожу в интерактивные узлы на суперкомпьютере, к которому у меня есть доступ - и я часто запускаю вещи и двигаюсь дальше. Есть около 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, кажется, что он завершает весь сеанс и все, что выполняется внутри (без проверки, запущены ли процессы). Твики отсюда?

1 ответ1

2

Одним из вариантов является запуск программ в качестве основной команды экрана, после чего экран закроется, когда они будут выполнены.

Если вышеупомянутое бесполезно, вы могли бы оценить, сколько процессов запущено, посмотрев, сколько из них связано с оболочками 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

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .