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
运行。
如何正确地杀死整个子进程?
你可以看看rkill
,似乎满足您的要求:
http://www.unix.com/man-page/debian/1/rkill/
rkill [-SIG] PID /名称...
当作为rkill调用,这实用程序不会显示有关进程的信息,但 将它们全部发送给它们。如果未在命令行中指定,则发送终止信号(SIGTERM)。
虽然'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
贝壳通常不会发送信号给他们的孩子。但是这并不明显,因为在终端,如果你运行睡眠,孩子直接得到信号。 –
这会杀死'sleep',但有趣的是'echo done'会被执行。我可以通过将子进程中的命令与'&&'而不是'''一起链接来解决这个问题,从而产生一个可行的解决方案。 –
@jmd_dk - 我说错了,当我说,它杀死**也**杀死所有的孩子,其实它杀死所有的孩子,我会编辑我的答案 – MacHala
提示:它还在吗? –
@KolyolyHorvath还有什么? –