Bash:杀死subprocess中的所有进程

bash中,我可以通过$!获得最后一个subprocess的进程ID( pid ) variables。 我可以在完成之前杀死这个subprocess:

 (sleep 5) & pid=$! kill -9 $pid 

这工作如广告。 如果现在在sleep之后用更多的命令扩展subprocess,则在subprocess被终止之后,即使其他命令从不被执行, sleep命令也会继续。

作为一个例子,考虑下面这个,它使用ps加速一个subprocess并监视它的暗杀行为:

 # Start subprocess and get its pid (sleep 5; echo done) & pid=$! # grep for subprocess echo "grep before kill:" ps aux | grep "$pid\|sleep 5" # Kill the subprocess echo echo "Killing process $pid" kill -9 $pid # grep for subprocess echo echo "grep after kill:" ps aux | grep "$pid\|sleep 5" # Wait for sleep to finish sleep 6 # grep for subprocess echo echo "grep after sleep is finished:" ps aux | grep "$pid\|sleep 5" 

如果我把它保存到一个名为filename并运行它,我得到这个打印输出:

 grep before kill: username 7464 <...> bash filename username 7466 <...> sleep 5 username 7467 <...> grep 7464\|sleep 5 Killing process 7464 grep after kill: username 7466 <...> sleep 5 username 7469 <...> grep 7464\|sleep 5 grep after sleep is finished: username 7472 <...> grep 7464\|sleep 5 

ps命令中不重要的信息被replace为<...> 。 它看起来像kill已经杀死了filename的整体bash执行,而保持sleep运行。

我怎样才能正确地杀死整个subprocess?

您可以在子shell中设置一个陷阱,以便在退出之前终止任何活动的作业:

  (trap 'kill $(jobs -p)' EXIT; sleep 5; echo done ) & pid=$! 

你可以看看似乎满足你的要求的rkill

http://www.unix.com/man-page/debian/1/rkill/

rkill [-SIG] pid / name …

当作为rkill被调用时,该实用程序不显示有关进程的信息,而是将它们全部发送给一个信号。 如果未在命令行中指定,则发送终止(SIGTERM)信号。

我不知道到底是为什么那个睡眠过程变成孤儿,反而是杀了你可以用-P标志来使用pkill 杀死所有的孩子

 pkill -TERM -P $pid 

编辑:这意味着,为了杀死一个进程,所有它的孩子,你应该使用

 CPIDS=`pgrep -P $pid` # gets pids of child processes kill -9 $pid for cpid in $CPIDS ; do kill -9 $cpid ; done