所以,我有一些这样的工作:
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
也适用。