在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
运行。
如何正确杀死整个子流程?
您可以在子shell中设置一个陷阱,以在退出前杀死所有活动作业:
(trap 'kill $(jobs -p)' EXIT; sleep 5; echo done ) & pid=$!
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句