当主进程启动多个子进程并退出时,如何为systemd设置PIDFile?

时间:2018-05-31 13:31:07

标签: server daemon systemd

环境:Ubuntu 16.04,c语言编程的守护进程,使用systemd进行进程管理。

所以我把单位文件作为:

[Unit]
Description=Fantastic Service
After=network.target

[Service]
Restart=always
Type=forking
ExecStart=/opt/fan/tastic

[Install]
WantedBy=multi-user.target

在我的tastic.c代码中,它基本上是fork()X个子进程,每个子进行so_reuseport,并且主进程退出,让子进程处理请求。

使用上面的设置它可以正常工作,我得到了预期的行为。

但是,如果我把PIDFile放在服务单元文件中,我得到的是我的应用程序提供的pid是一个僵尸,它是 - 因为我的主进程在启动所请求的子进程数后退出。

现在在systemd文档中,它明确指出如果你执行Type = forking,你应该提供PIDFile,但问题是当有多个子节点并且主父进程退出时,我应该如何提供单个pid文件一旦孩子开始?

我错过了什么吗?

1 个答案:

答案 0 :(得分:1)

正如您所发现的那样,在您的情况下系统正常工作没有PIDFile=。文档建议使用PIDFile=,但我认为这是针对单个主要流程的情况,这不适用于您的情况。

另见man systemd.kill,其中解释了如何杀死进程。默认值为“control-group”,它会杀死“控制组中的所有剩余进程”。

因此,默认情况下,systemd将在“停止”时间为您清理所有这些子进程,这就是您想要的。

对于 拥有主要流程的人,他们可能希望使用KillMode=process,在这种情况下设置PIDFile=可能有所帮助,但这不适用对你的情况。