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

How to set PIDFile for systemd when main process start multiple child and exit?

环境:Ubuntu16.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 是 non-existent,它是 - 因为我的主进程在启动请求的数量后退出孩子们。

现在在 systemd 文档中它清楚地指出如果你做 Type=forking 你应该提供 PIDFile,但问题是当有多个孩子和主要 parent 子进程启动后进程退出?

我错过了什么吗?

如您所见,在您的情况下,系统在没有 PIDFile= 的情况下工作正常。文档 推荐 使用 PIDFile=,但我相信这是针对只有一个主进程的情况,不适用于您的情况。

另请参阅 man systemd.kill,其中解释了如何终止进程。默认是 "control-group",它会杀死 "all remaining processes in the control group"。

所以默认情况下,systemd 会在 "stop" 时间为您清理所有这些子进程,这正是您想要的。

对于 做过 的人来说,他们可能想使用 KillMode=process,在这种情况下,设置 PIDFile= 可能会有所帮助,但这不适用于您的情况。