bash ジョブをグループとして制御しますか?

bash ジョブをグループとして制御しますか?

特定のセッション内でジョブのグループを制御する方法はありますかbash?

理想的には、次のようなことを言いたいです:

$ prog1 &   
$ GROUP=FOO prog2 &
$ GROUP=FOO prog3 &
$ GROUP=BAR prog4 &

そして、例えばとkill %FOOのみを終了させます。prog2prog3

答え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 秒でも可) により、プロセスはエラー コードで終了する時間が与えられます。

関連情報