我需要拦截重启或关机。 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知道的内容,但是我该怎么做呢?
答案 0 :(得分:4)
如果您的程序未由init系统启动,则它不会由init系统管理。从init.d脚本启动它以获得所描述的好处。