【问题标题】:How to set PIDFile for systemd when main process start multiple child and exit?当主进程启动多个子进程并退出时,如何为 systemd 设置 PIDFile?
【发布时间】:2018-11-10 12:58:28
【问题描述】:

环境: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 个子进程,每个子进程都这样做了_reuseport,然后主进程退出,让子进程处理请求。

通过上述设置,它工作正常,我得到了预期的行为。

但是,如果我将 PIDFile 放在服务单元文件中,我会发现我的应用程序提供的 pid 不存在,它确实存在 - 因为我的主进程在启动请求的子进程后退出。

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

我错过了什么吗?

【问题讨论】:

    标签: server daemon systemd


    【解决方案1】:

    如您所见,在您的情况下,如果没有PIDFile=,系统也可以正常工作。文档推荐使用PIDFile=,但我认为这是针对单一主进程的情况,不适用于您的情况。

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

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

    对于确实有主进程的人,他们可能想要使用KillMode=process,在这种情况下设置PIDFile= 可能会有所帮助,但这不适用于您的情况。

    【讨论】:

      猜你喜欢
      • 2015-11-19
      • 2010-09-21
      • 2021-02-25
      • 1970-01-01
      • 2012-10-26
      • 1970-01-01
      • 1970-01-01
      • 2018-09-11
      • 2017-04-15
      相关资源
      最近更新 更多