だから、私はこのような仕事をしています:
sleep 30 | sleep 30 &
自然な考え方は次のとおりです。
kill `jobs -p`
しかし、これは最初のsleep
のみを殺し、2番目は殺しません。
これを行うと、両方のプロセスが強制終了されます。
kill %1
しかし、そのようなジョブがたくさん実行されている場合、それは多くても1つのジョブを殺すだけです。
同じ名前のプロセスを強制終了してはいけませんが、このシェルでは実行されません。
これを使って:
pids=( $(jobs -p) )
[ -n "$pids" ] && kill -- "${pids[@]/#/-}"
jobs -p
は、プロセスグループリーダーのPIDを出力します。 kill
に負のPIDを提供することにより、そのプロセスグループ(man 2 kill
)。 "${pids[@]/#/-}"
は、配列pids
に格納されている各PIDを否定するだけです。
Xhienneの回答のやや短いバージョンですが、pure-bashではありません。
jobs -p | xargs -I{} kill -- -{}
pkill
およびpgrep
を使用して、プロセス名のリストを強制終了できます。
Manページから:
pgrep現在実行中のプロセスを調べ、選択基準に一致するプロセスIDをstdoutにリストします。すべての基準が一致する必要があります。たとえば、pgrep -u root sshdは、sshdと呼ばれ、rootが所有するプロセスのみを一覧表示します。一方、pgrep -u root、daemonは、rootが所有するプロセスをリストしますOR daemon。pkillは、指定されたシグナル(デフォルトではSIGTERM)をそれぞれに送信しますstdoutにリストする代わりに処理します。
pgrep
、pkill
、
$ pgrep -l script.sh
12406 script.sh
12425 script.sh
$ pkill $(pgrep script.sh)
$ cat signal-log
Name: ./script.sh Pid: 12406 Signal Received: SIGTERM
Name: ./script.sh Pid: 12425 Signal Received: SIGTERM
kill $( jobs -p )
...を使用してください。 kill
のargvのジョブが多すぎる場合は、これを使用します(おそらく発生する可能性があります)。
killalljobs() { for pid in $( jobs -p ); do kill -9 $pid ; done ; }
これにより、すべてのジョブが強制終了され、最近作成されたものが最初に作成されます。
while kill %%; do :; done
これは、殺すジョブがなくなると停止し、印刷します。
bash: kill: %%: no such job
zsh
でも動作します。