首页 > 解决方案 > 如何杀死陷阱中的进程组?

问题描述

在 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发出进程组的 ppid 和进程组的进程(sleep 100 | tee ...)不能tee ...像上面那样被杀死。它需要做kill -TERM -PGID。有什么简单的方法可以让作业输出进程组 PGID?或者是否有任何命令可以通过 PPID 和具有统一接口的进程 PID 杀死进程组?

更新: kill -TERM 0在这里不起作用,因为它也会杀死自己。但是在杀死所有工作之后我仍然需要做一些事情。

标签: linuxbashpid

解决方案


我发现的唯一方法是直接杀死子进程。

#!/usr/bin/env bash

function cleanup()
{
    jobs -l
    for p in $(jobs -p); do
        kill $(pgrep -P $p)
    done
    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

我试图杀死 PGID,但这对我不起作用。


推荐阅读