环境: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文件一旦孩子开始?
我错过了什么吗?
答案 0 :(得分:1)
正如您所发现的那样,在您的情况下系统正常工作没有PIDFile=
。文档建议使用PIDFile=
,但我认为这是针对单个主要流程的情况,这不适用于您的情况。
另见man systemd.kill
,其中解释了如何杀死进程。默认值为“control-group”,它会杀死“控制组中的所有剩余进程”。
因此,默认情况下,systemd
将在“停止”时间为您清理所有这些子进程,这就是您想要的。
对于 拥有主要流程的人,他们可能希望使用KillMode=process
,在这种情况下设置PIDFile=
可能有所帮助,但这不适用对你的情况。