我需要拦截重新启动或关闭。程序是这样的:
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.
....
}
Run Code Online (Sandbox Code Playgroud)
当我通过“kill -15”进行测试时,这是有效的。但是,当我尝试“重新启动”或“关闭”命令时,它从未收到信号。init 手册页显示:
“当 init 被请求更改运行级别时,它会向新运行级别中未定义的所有进程发送警告信号 SIGTERM。然后,它会等待 5 秒,然后通过 SIGKILL 信号强制终止这些进程。请注意,init 假定所有这些进程(及其后代)保留在 init 最初为其创建的同一进程组中。如果任何进程更改其进程组从属关系,它将不会收到这些信号。此类进程需要单独终止。”
如何告诉 init 守护进程向该程序发送 SIGTERM?我的猜测是我应该将进程组 ID 设置为 init 知道的值,但我该怎么做呢?