私がやりたいことを示す小さなスクリプトがあります。
#!/bin/bash
> z
tail -f z | grep 'd' &
echo $!
$!
grepプロセスのPIDを提供します。 grepプロセスと同時にtailプロセスを終了できるようにしたいです。これにより、kill "pid of grep"
tailプロセスは終了しません。でもなくkillall grep
。使ってもいいけどkillall tail
危険だと思います。
ベストアンサー1
コマンドを括弧で囲みます。
( tail -f z | grep 'd' ) &
kill -- -$!
これにより、サブプロセス全体が終了します。
ここでは、終了する負のPIDを指定してプロセスグループ全体を終了します。バラよりman 1 kill
:
負のPID値は、プロセスグループ全体を選択するために使用できます。 psコマンド出力のPGID列を参照してください。
またはman 2 kill
:
pidが-1未満の場合、IDが-pidのプロセスグループ内のすべてのプロセスにsigが送信されます。
しかし、kill -PID
それだけで動作しますジョブ制御が有効な場合in bash
(対話型シェルのデフォルト値)。そうしないと、子プロセスに専用のプロセスグループがなく、kill コマンドが失敗します。kill: (-PID) - No such process
この問題を解決するには、bash
()set -m
でジョブ制御を有効にするか、pkill -P $!