
私は、自分がアクセスできるスーパーコンピューターのインタラクティブ ノードにログインするときに、頻繁に screen を使用します。そして、何かを実行してから、次に進むこともよくあります。ログインできる個別のノードは約 20 個あり、そのうちの 1 つをチェックすると、4 つの独立したセッションが存在します。これらのセッションのそれぞれには、おそらく 5 つの screen セッションが含まれます。
これらすべてを循環して、プロセスが実行されていない場合は閉じる簡単な方法はありますか? 現在のプロセスは、screen -ls
とscreen -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