すべてのスクリーンセッションを自動的に循環(閉じる)する方法

すべてのスクリーンセッションを自動的に循環(閉じる)する方法

私は、自分がアクセスできるスーパーコンピューターのインタラクティブ ノードにログインするときに、頻繁に screen を使用します。そして、何かを実行してから、次に進むこともよくあります。ログインできる個別のノードは約 20 個あり、そのうちの 1 つをチェックすると、4 つの独立したセッションが存在します。これらのセッションのそれぞれには、おそらく 5 つの screen セッションが含まれます。

これらすべてを循環して、プロセスが実行されていない場合は閉じる簡単な方法はありますか? 現在のプロセスは、screen -lsscreen -r ####入力して、exitベース画面に戻るまで入力することです。

編集

以下は Thor の回答に基づいて作成したスクリプトです。

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 つのオプションは、プログラムを 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

関連情報