Вопрос Способ автоматического цикла (закрытия) во всех сеансах экрана


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

Когда я запускаю его с убийством, с сеансами ничего не происходит. Когда я запускаю с завершением работы, он, похоже, убивает весь сеанс и все, что работает внутри (без проверки наличия запущенных процессов). Твики отсюда?


2
2017-09-30 06:17


происхождения


С помощью Ctrl-d для выхода ускорит вас. - Thor


ответы:


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

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

2
2017-09-30 08:41



Я немного изменил его, чтобы немного поработать над тем, что происходило в вашем скрипте. Я поставил вопрос в EDIT, потому что форматирование сделало невозможным здесь. - JBWhitmore