在bash脚本中,我通常使用陷阱来清理生成的进程:
function cleanup()
{
jobs -l
jobs -p | xargs -r -I {} kill -TERM {}
jobs -l
echo "do something after kill all jobs."
}
trap cleanup EXIT
但是,这不适用于过程组:
function cleanup()
{
jobs -l
jobs -p | xargs -r -I {} kill -TERM {}
jobs -l
echo "do something after kill all jobs."
}
trap cleanup EXIT
(sleep 100 | tee /tmp/sleep_test.log) | tee sleep_test2.log &
ps -ax -o pid,pgid,ppid,args | grep sleep
jobs -l
sleep 1
jobs -p
给出(sleep 100 | tee ...)
的进程组的小指和tee ...
的进程。无法如上所述杀死进程组。它需要做kill -TERM -PGID
。有什么简单的方法可以让作业输出进程组PGID?还是有任何命令可以通过统一的接口通过PPID和进程PID终止进程组?
更新:kill -TERM 0
在这里不起作用,因为它也会杀死自己。但是在杀死所有工作之后我仍然需要做一些事情。
您需要wait
进行后台作业:
wait