gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-04 01:56:06 25 4
gpt4 key购买 nike

环境: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 文件一旦 child 开始?

我错过了什么吗?

最佳答案

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

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

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

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

关于server - 当主进程启动多个子进程并退出时,如何为 systemd 设置 PIDFile?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50625549/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com