【问题标题】:Why didn't this program receive SIGTERM on init/reboot/shutdown?为什么这个程序在 init/reboot/shutdown 时没有收到 SIGTERM?
【发布时间】:2011-04-21 21:19:19
【问题描述】:

我需要拦截重启或关机。程序是这样的:

void sig_handler(int sig) {
    if (sig == SIGTERM) {
        /* do something */
    }
}

int main() {
    ....
    signal(SIGTERM, sig_handler);

    /* daemon */
    pid = fork();
    if (pid > 0) exit(EXIT_SUCCESS);
    // I didn't do setsid() to retain process group id.
    ....
}

当我通过“kill -15”进行测试时,这有效。但是,当我尝试“重启”或“关机”命令时,它从未收到信号。初始化手册页说:

"当请求 init 更改运行级别时,它会向所有未在新运行级别中定义的进程发送警告信号 SIGTERM。然后等待 5 秒,然后通过 SIGKILL 信号强制终止这些进程。请注意,init 假设“

如何告诉 init 守护进程发送 SIGTERM 给这个程序?我的猜测是我应该将进程组 ID 设置为 init 知道的东西,但我该怎么做呢?

【问题讨论】:

    标签: c linux signals


    【解决方案1】:

    如果你的程序不是由 init 系统启动的,它就不会被 init 系统管理。从 init.d 脚本启动它以获得所描述的好处。

    【讨论】:

    • 有没有一种编程方法可以将 pgid 设置为 init 知道的东西?
    • 怀疑 init 会查找父链,但如果我是你,我会阅读源代码。
    • 据我所知,您不能加入现有的进程组;你只能创建一个新的。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-10-26
    • 2011-12-07
    • 2018-05-17
    • 2010-10-07
    • 1970-01-01
    相关资源
    最近更新 更多