在bash中,我可以通过$获取最后一个子进程的进程ID(pid)!变量.然后我可以在它完成之前终止这个子进程:
(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已经杀死了文件名的整体bash执行,同时让睡眠运行.
我怎样才能正确杀死整个子进程?
解决方法:
您可以在子shell中设置陷阱以在退出之前终止所有活动作业:
(trap 'kill $(jobs -p)' EXIT; sleep 5; echo done ) & pid=$!
标签:bash,shell,unix,linux,kill
来源: https://codeday.me/bug/20190627/1308654.html