gpt4 book ai didi

bash - 是否有相当于 prctl (PR_SET_PDEATHSIG, SIGKILL) 的 shell 脚本来处理僵尸 child ?

转载 作者:行者123 更新时间:2023-12-03 14:49:31 24 4
gpt4 key购买 nike

C 和 C++,我一直在使用 prctl(PR_SET_PDEATHSIG, SIGKILL);它工作得很好。当我在 shell 脚本中生成子进程时,我使用了这样的东西:

    pid=$!

trap "kill $pid" SIGHUP SIGINT SIGTERM

wait
除了 shell 脚本获得 SIGKILL(它无法捕获)之外,它适用于所有情况。然后我最终将 shell 脚本的子节点变成了僵尸。
shell 脚本有没有办法让 SIGKILL 传递给他们的 child ?
我对这适用于什么 shell 持开放态度,但理想情况下它是 bash 或 sh。
更新
因此,根据下面的评论,我将提供一些背景信息,看看我是否应该完全使用不同的方法。我们的设置大致按照以下方式构建:
+ systemd
+ a_c_process
+ a_c_process
+ a_c_process
+ a_leaf_c_process
+ shellscriptA
+ a_leaf_c_process
+ a_leaf_c_process
因此,虽然 SIGTERM 可以是我们的起始信号(例如,任何非叶 c 进程在收到 SIGTERM 时都可以向其所有子进程发送 SIGTERM),但是如果树中的进程没有正确处理 SIGTERM,我的理解是我应该期望 systemd发送 SIGKILL。我们一直在使用 PR_SET_PDEATHSIG 来确保整个进程树都没有僵尸。
据我所知,这种技术应该能够与 SIGTERM 处理共存。也就是说,我可以安装 SIGTERM 处理程序,但如果这些处理程序失败,也可以将 PR_SET_DEATHSIG 作为后备。

最佳答案

正如处处所指出的,Bash 不允许捕获 KILL,但您可以生成另一个进程来监视它。您可以做几件事,例如看门狗,但我喜欢基于 this Unix & Linux answer 的解决方案。使用 strace监控父进程:

#!/bin/bash

function handlekill() {
echo "I was KILLed!"
}

curpid=$$
( strace -p $curpid -e 'trace=!all' 2>&1 | grep -q SIGKILL && handlekill )&

sleep 60
echo done
如果你那么 kill -9在这个过程中,你会得到输出“我被杀了!”。剩下的就是接线了。
注意事项:
  • 需要strace安装。
  • 除非内核的 YAMA ptrace_scope 否则不能在现代 Linux 上工作被禁用或者您只能以 root 身份运行脚本。
  • 关于bash - 是否有相当于 prctl (PR_SET_PDEATHSIG, SIGKILL) 的 shell 脚本来处理僵尸 child ?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51501980/

    24 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com