如何杀死 bash 中的所有作业?

如何杀死 bash 中的所有作业?

所以,我有一些这样的工作:

sleep 30 | sleep 30 &

自然的思考方式是:

kill `jobs -p`

但这只能杀死第一个sleep,而不会杀死第二个。

这样做会杀死两个进程:

kill %1

但如果有大量此类作业正在运行,那么最多只会杀死一项作业。

它不应该终止具有相同名称但不在该 shell 中运行的进程。

答案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[@]/#/-}"只是否定 array 中存储的每个 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也适用。

相关内容