Bashですべてのタスクを終了するには?

Bashですべてのタスクを終了するには?

だから、次のように動作するものがあります。

sleep 30 | sleep 30 &

それについて考える自然な方法は次のとおりです。

kill `jobs -p`

しかし、これは最初のものだけを殺し、sleep2番目は死ぬことはありません。

これを行うと、両方のプロセスが終了します。

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また適用可能です。

関連情報