一種自動循環(關閉)所有螢幕會話的方法

一種自動循環(關閉)所有螢幕會話的方法

當我登入我有權訪問的超級電腦的互動式節點時,我經常使用螢幕 - 而且我經常運行一些東西並繼續前進。我可以登入大約 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

一種選擇是將程式作為 screen 主命令運行,然後 screen 將在完成後退出。

如果上述方法沒有用,您可以透過查看有多少個進程連接到 shell 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

相關內容