太长了;

太长了;

我有个问题。在研究进程管理时,我在 CentOS 7 上观察到一个奇怪的行为。我知道杀死父进程时,子进程也会被杀死。但在以下情况下则不然。我运行了命令 dd,例如:

[root@server2 ~]# dd if=/dev/zero of=/dev/null &
[1] 1756

[root@server2 ~]# ps fax | grep -B2 dd
1737 pts/2    S      0:00         \_ su -
1741 pts/2    S      0:00             \_ -bash
1756 pts/2    R      1:18                 \_ dd if=/dev/zero of=/dev/null

之后我尝试杀死(使用 SIGKILL 信号)父进程,即 bash,但此操作不会杀死 dd 进程:

[root@server2 ~]# kill -9 1741
Killed
[user@server2 ~]#

shell 终止,但正如您在 top 命令输出中看到的,dd 进程仍在工作:

PID USER      PR  NI    VIRT    RES    SHR S %CPU %MEM     TIME+ COMMAND
1756 root      20   0  107948    612    512 R 99.9  0.1  10:06.98 dd

请问您对此有什么想法吗?

答案1

默认情况下,杀死父进程不会杀死子进程。

我建议您寻找有关如何使用进程组(负 PID)杀死父进程和子进程的其他问题。

关于如何详细执行此操作的一个很好的答案可以在以下位置找到:进程后代

答案2

我遇到了类似的情况并找到了答案。

太长了;

尝试:kill -2 <parent_pid>

Ctrl如果在运行脚本时按+C会杀死父进程和所有生成的进程,您就会知道此方法是否适合您。

其原因是kill可以发送不同的信号。默认情况下kill <pid>会发送15 <SIGTERM>信号。但按Ctrl+时的常规信号实际上并非C如此。15 <SIGTERM>2 <SIGINT>

所以如果你kill -2 <pid>这会杀死你的父进程,就像用Ctrl+中断它一样C

来源

答案3

请根据自己的需要进行调整,尤其是在kill命令上:

function kill_recurse() {
    cpids=`pgrep -P $1|xargs`
    for cpid in $cpids;
    do
        kill_recurse $cpid
    done
    echo "killing $1"
    kill -9 $1
}

示例用法如下:kill_recurse <my_parent_pid>

相关内容