在bash中,我可以通过$!
变量获取最后一个子进程的进程ID(pid
)。然后我可以在它结束之前杀掉这个子进程:
(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
已经杀死了 filename
的整个 bash 执行过程,同时保留了 sleep
运行。
我该如何正确地杀死整个子进程?