我需要拦截重启或关机。 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. .... }
当我通过“杀-15”进行testing时,这是有效的。 但是,当我尝试“重新启动”或“关机”命令,它从来没有收到信号。 init手册页说:
“当init被要求改变运行级别时,它会发送警告信号SIGTERM给所有在新的运行级别中未定义的进程,然后等待5秒钟,然后通过SIGKILL信号强制终止这些进程注意init假定所有这些进程(及其后代)仍然保留在原来为它们创build的同一个进程组中,如果任何进程改变其进程组联系,它将不会收到这些信号,这些进程需要单独终止。
如何告诉init守护进程发送SIGTERM到这个程序? 我的猜测是我应该把进程组ID设置为init知道的东西,但我该怎么做呢?
如果你的程序不是由init系统启动的,它将不会被init系统管理。 从init.d脚本启动它来获得所描述的好处。