Bash:杀死子进程中的所有进程

问题描述:

在bash中,我可以通过$!变量获取最后一个子进程的进程ID(pid)。然后我可以在它完成之前杀死这个子进程:Bash:杀死子进程中的所有进程

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

这可以像广告中那样工作。如果我现在使用sleep之后的更多命令扩展子进程,则命令将在子进程终止后继续执行,即使其他命令从未得到执行。

作为一个例子,考虑以下,其旋转起来一个子进程,并监控其暗杀使用ps

# 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命令的不重要的信息被替换为<...>。看起来kill已经杀死了filename的整体bash执行,同时保留sleep运行。

如何正确地杀死整个子进程?

+0

提示:它还在吗? –

+0

@KolyolyHorvath还有什么? –

您可以在子shell设下的陷阱在退出之前杀死任何活动的作业:

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

这不适合我。什么是'作业-p'应该输出?我运行它时不输出任何内容。 –

+0

啊,我忘了提及一个重要的观点:你不需要使用'kill -9',因为这会导致操作系统立即杀死进程*,而没有机会运行它的'EXIT'处理程序。 “杀”本身就足够了。 – chepner

+0

'jobs -p'列出了由shell管理的所有当前活动作业的进程ID。 – chepner

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

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

rkill [-SIG] PID /名称...

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

+0

虽然'rkill' /'pslist'似乎不是大多数Linux系统上安装的标准工具。 –

我不知道为什么,睡眠过程中被孤立,而不是反正杀你可以用pkill的使用-P标志杀死所有儿童

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 
+0

贝壳通常不会发送信号给他们的孩子。但是这并不明显,因为在终端,如果你运行睡眠,孩子直接得到信号。 –

+0

这会杀死'sleep',但有趣的是'echo done'会被执行。我可以通过将子进程中的命令与'&&'而不是'''一起链接来解决这个问题,从而产生一个可行的解决方案。 –

+0

@jmd_dk - 我说错了,当我说,它杀死**也**杀死所有的孩子,其实它杀死所有的孩子,我会编辑我的答案 – MacHala