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(参见上面的代码)。此外,请查看您的服务的 StandardOutput
和 StandardErrro
配置条目。
您当前观察到的延迟发生是因为 'systemctl' 在发送 TERM 信号后等待几秒钟 - 使守护程序更改终止。如果守护进程没有主动终止,将发送一个 KILL 信号,这将强制守护进程立即无条件终止。
我正在尝试捕获 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(参见上面的代码)。此外,请查看您的服务的 StandardOutput
和 StandardErrro
配置条目。
您当前观察到的延迟发生是因为 'systemctl' 在发送 TERM 信号后等待几秒钟 - 使守护程序更改终止。如果守护进程没有主动终止,将发送一个 KILL 信号,这将强制守护进程立即无条件终止。