
特定のセッション内でジョブのグループを制御する方法はありますかbash
?
理想的には、次のようなことを言いたいです:
$ prog1 &
$ GROUP=FOO prog2 &
$ GROUP=FOO prog3 &
$ GROUP=BAR prog4 &
そして、例えばとkill %FOO
のみを終了させます。prog2
prog3
答え1
特定の bash セッション内でジョブのグループを制御する方法はありますか?
はい、あります! - 配列を使用してグループを形成し、各プロセス ID をキャプチャし$!
て配列に追加します。
$!
はPOSIXで規定された特別なパラメータ最新のバックグラウンド コマンドの 10 進プロセス ID を返します。
以下は、Bash で配列に追加し、質問のコンテキストで配列を列挙する方法のチュートリアルです。
まず配列を宣言します。
$ GROUP_FOO=()
$ GROUP_BAR=()
グループに属していないジョブ:
$ prog1 &
FOO グループに移動するジョブ (+=
表記は、値を配列に追加する必要があることを示しています):
$ prog2 &
$ GROUP_FOO+=($!)
FOO グループで実行するもう 1 つのジョブ:
$ prog3 &
$ GROUP_FOO+=($!)
BARグループでの仕事:
$ prog4 &
$ GROUP_BAR+=($!)
FOO グループのプロセスを強制終了するには:
$ for id in ${GROUP_FOO[@]}; do kill $id; done
スクリプト版
これをスクリプト化する場合は、正常に起動した場合にのみプロセス ID が配列に追加されるように少し修正します。
prog2 & sleep 0.1; kill -0 $! && GROUP_FOO+=($!)
こうすることで、エラーですぐに終了したために実行されていないプロセス ID が配列内に存在する可能性が低くなります。0.1 秒のスリープ遅延 (おそらく 0.01 秒でも可) により、プロセスはエラー コードで終了する時間が与えられます。