SIGTERM 信号处理程序未打印到控制台

SIGTERM signal handler not printing to a console

我正在尝试捕获 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

当守护进程停止时,我预计该消息将打印在控制台上。但是,该消息不会打印出来,命令行也不会 return 到命令提示符。一段时间后它会 return (超时)。守护进程将停止,但不会打印消息。

我做错了什么?

需要考虑两个事项:在收到信号时终止守护程序,并获取消息。

在 systemctl 上下文中,您希望信号处理程序退出程序。除此以外, 它只会 'print' 一条消息,然后继续处理。尝试

void SigStop_Handler(int sig)
{
   D(fprintf(stderr, "****************** HANDLED STOP SIGNAL ******************\n"));
   printf("\n");
   exit(sig+128) ;
}

此外,鉴于进程 运行 作为守护进程,stdout 不会连接到终端。相反,它将被重定向到日志文件中。此外,建议使用 stderr 发送消息,而不是 stdout(参见上面的代码)。此外,请查看您的服务的 StandardOutputStandardErrro 配置条目。

您当前观察到的延迟发生是因为 'systemctl' 在发送 TERM 信号后等待几秒钟 - 使守护程序更改终​​止。如果守护进程没有主动终止,将发送一个 KILL 信号,这将强制守护进程立即无条件终止。