我正在 try catch SIGTERM 信号并在来自 Linux 守护进程的处理程序中打印一条消息:
void SigStop_Handler(int sig)
{
D(printf("****************** HANDLED STOP SIGNAL ******************\n"));
printf("\n");
}
int main(int argc, char *argv[])
{
signal(SIGTERM, SigStop_Handler);
while(true)
{
//do something
}
return 0;
}
程序作为守护进程运行,从命令行启动:
systemctl start abc
deameon 将被停止:
systemctl stop abc
当守护进程停止时,我预计消息会打印在控制台上。然而,消息没有被打印出来,命令行也没有返回到命令提示符。它确实在一段时间后返回(超时)。守护进程将停止,但不会打印消息。
我做错了什么?
需要考虑两件事:在收到信号时终止守护进程,并获取消息。
在 systemctl 的上下文中,您希望信号处理程序退出程序。否则,它只会“打印”消息消息,然后继续处理。尝试
void SigStop_Handler(int sig)
{
D(fprintf(stderr, "****************** HANDLED STOP SIGNAL ******************\n"));
printf("\n");
exit(sig+128) ;
}
此外,假设进程作为守护进程运行,stdout 将不会连接到终端。相反,它将被重定向到日志文件中。此外,建议使用 stderr 发送消息,而不是 stdout(参见上面的代码)。另外,查看服务的 StandardOutput
和 StandardErrro
配置条目。
您当前观察到的延迟发生是因为“systemctl”在发送 TERM 信号后等待几秒钟 - 使守护程序更改终止。如果守护进程没有主动终止,将发送 KILL 信号,这将强制守护进程立即无条件终止。
我是一名优秀的程序员,十分优秀!