だから、次のように動作するものがあります。
sleep 30 | sleep 30 &
それについて考える自然な方法は次のとおりです。
kill `jobs -p`
しかし、これは最初のものだけを殺し、sleep
2番目は死ぬことはありません。
これを行うと、両方のプロセスが終了します。
kill %1
ただし、実行中のジョブが多い場合は、最大1つのジョブが終了します。
名前は同じですが、このシェルで実行されていないプロセスを終了しないでください。
答え1
xhienneの答えの短いバージョンですが、純粋なbashではありません。
jobs -p | xargs -I{} kill -- -{}
答え2
これを使用してください:
pids=( $(jobs -p) )
[ -n "$pids" ] && kill -- "${pids[@]/#/-}"
jobs -p
プロセスグループリーダーのPIDを印刷します。負のPIDを提供することによって、対応するkill
プロセスグループ()に属するすべてのプロセスを終了しますman 2 kill
。"${pids[@]/#/-}"
配列に保存されている各PIDを無効にするだけですpids
。
答え3
使用kill $( jobs -p )
...本当に気に入っています。 argvタスクが多すぎる場合は、次のように使用しますkill
(これが起こる可能性があります):
killalljobs() { for pid in $( jobs -p ); do kill -9 $pid ; done ; }
答え4
これにより、最後に作成されたジョブから始まり、すべてのジョブが終了します。
while kill %%; do :; done
終了するジョブがもう存在しない場合は停止し、次の内容が印刷されます。
bash: kill: %%: no such job
zsh
また適用可能です。