【问题标题】:killing Parent process along with child process using SIGKILL使用 SIGKILL 杀死父进程和子进程
【发布时间】:2014-03-19 02:52:22
【问题描述】:

我正在编写一个 shell 脚本,其中我有父进程,它有由sleep & 命令创建的子进程。现在我想杀死父进程,这样子进程也将被杀死。我可以使用以下命令做到这一点:

trap "kill $$" SIGINT
trap 'kill -HUP 0' EXIT
trap 'kill $(jobs -p)' EXIT

这些命令与kill [parent_process_ID] 命令一起使用,但如果我使用kill -9 [parent_process_ID],那么只会杀死父进程。 请指导我进一步实现此功能,以便当我使用任何命令杀死父进程时,子进程也应该被杀死。

【问题讨论】:

    标签: linux shell unix pid kill-process


    【解决方案1】:

    当你单独杀死一个进程时,它不会杀死子进程。

    如果您希望给定组的所有进程都接收信号,则必须将信号发送到进程组。

    kill -9 -parentpid
    

    否则,孤儿将链接到init

    通过在prctl() 系统调用中指定选项PR_SET_PDEATHSIG,子进程可以要求内核在父进程死亡时传递SIGHUP(或其他信号),如下所示:

    prctl(PR_SET_PDEATHSIG, SIGHUP);
    

    详情请见man 2 prctl

    【讨论】:

    • 我试过了,但我认为我没有名为 prctl 的函数
    【解决方案2】:

    -9 信号(SIGKILL) 发送给程序没有机会让它执行自己的信号处理程序(例如,您的trap 语句)。这就是为什么孩子不会被自动杀死的原因。 (一般来说,-9 给应用程序没有机会自行清理。)您必须使用较弱的信号来杀死它(例如 SIGTERM。)

    详情请见man 7 signal

    【讨论】:

      猜你喜欢
      • 2012-01-31
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-10-14
      • 2011-09-23
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多