为什么这个程序在init / reboot / shutdown时没有收到SIGTERM?

时间:2011-04-21 21:19:20

标签: c linux signals

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

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'测试时,这是有效的。但是,当我尝试'reboot'或'shutdown'命令时,它从未收到信号。 init手册页说:

“当请求init更改运行级别时,它会将警告信号SIGTERM发送到新运行级别中未定义的所有进程。然后等待5秒,然后通过SIGKILL信号强制终止这些进程。请注意,init假定所有这些进程(及其后代)都保留在init最初为它们创建的进程组中。如果任何进程更改其进程组隶属关系,它将不会收到这些信号。这些进程需要单独终止。

如何告诉init守护进程将SIGTERM发送到此程序?我的猜测是我应该将进程组ID设置为init知道的内容,但是我该怎么做呢?

1 个答案:

答案 0 :(得分:4)

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