web-dev-qa-db-ja.com

bashですべてのジョブを殺すには?

だから、私はこのような仕事をしています:

sleep 30 | sleep 30 &

自然な考え方は次のとおりです。

kill `jobs -p`

しかし、これは最初のsleepのみを殺し、2番目は殺しません。

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

kill %1

しかし、そのようなジョブがたくさん実行されている場合、それは多くても1つのジョブを殺すだけです。

同じ名前のプロセスを強制終了してはいけませんが、このシェルでは実行されません。

3
user23013

これを使って:

pids=( $(jobs -p) )
[ -n "$pids" ] && kill -- "${pids[@]/#/-}"

jobs -pは、プロセスグループリーダーのPIDを出力します。 killに負のPIDを提供することにより、そのプロセスグループ(man 2 kill)。 "${pids[@]/#/-}"は、配列pidsに格納されている各PIDを否定するだけです。

3
xhienne

Xhienneの回答のやや短いバージョンですが、pure-bashではありません。

jobs -p | xargs -I{} kill -- -{}
4
sduthil

pkillおよびpgrepを使用して、プロセス名のリストを強制終了できます。

Manページから:

pgrep現在実行中のプロセスを調べ、選択基準に一致するプロセスIDをstdoutにリストします。すべての基準が一致する必要があります。たとえば、pgrep -u root sshdは、sshdと呼ばれ、rootが所有するプロセスのみを一覧表示します。一方、pgrep -u root、daemonは、rootが所有するプロセスをリストしますOR daemon。pkillは、指定されたシグナル(デフォルトではSIGTERM)をそれぞれに送信しますstdoutにリストする代わりに処理します。

pgreppkill

$ 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
2
Chen A.

kill $( jobs -p )...を使用してください。 killのargvのジョブが多すぎる場合は、これを使用します(おそらく発生する可能性があります)。

killalljobs() { for pid in $( jobs -p ); do kill -9 $pid ; done ; }

2
user2497

これにより、すべてのジョブが強制終了され、最近作成されたものが最初に作成されます。

while kill %%; do :; done

これは、殺すジョブがなくなると停止し、印刷します。

bash: kill: %%: no such job

zshでも動作します。

0
Tom Hale