Process

殺死父程序不會殺死子程序

  • December 25, 2021

我有個問題。研究程序管理我在 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 終止,但正如您在頂部命令輸出中看到的那樣,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

請問您對此有什麼想法嗎?

預設情況下,殺死父程序不會殺死子程序。

我建議您尋找有關如何使用程序組(負 PID)殺死父母和孩子的其他問題。

可以在Process descendants中找到有關如何詳細執行此操作的一個很好的答案

請根據自己的需要進行調整,尤其是在 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>

引用自:https://unix.stackexchange.com/questions/440691