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

jmd_dk:

在bash中,我可以pid通过$!变量获取最后一个子进程的进程ID(然后,我可以在此子进程完成之前将其杀死:

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

这工作如广告。如果我现在在之后用更多命令扩展子流程,则即使其他命令从未执行过sleep,该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已经杀死了的总体bash执行filename,而仍然无法sleep运行。

如何正确杀死整个子流程?

chepner:

您可以在子shell中设置一个陷阱,以在退出前杀死所有活动作业:

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

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章