如何教 systemd 检测服务进程是否已在运行?

如何教 systemd 检测服务进程是否已在运行?

有一个守护进程可以从命令行和 systemctl 启动。

/etc/systemd/system/mydaemon.service 包含 ExecStart= 和 PIDFile=,因此 Systemd 可以确定该服务是否正在运行:

[Unit]
After=network-online.target

[Service]
Type=simple
ExecStart=/usr/local/bin/mydaemon --no-fork
PIDFile=/var/run/mydaemon-%i.pid

[Install]
WantedBy=multi-user.target

为什么“systemctl status mydaemon”说守护进程已停止,即使它正在运行?

如何告诉 systemd 守护进程不仅可以通过“systemctl start”运行,还可以直接运行?

答案1

不要这样做。始终使用 来启动它systemctl。关闭服务,然后以让 知道的方式启动它systemd

这可能不是您想要的答案。您甚至可能可以做到您要求的事情,但何必呢?

答案2

好吧,我查看了systemd手册,没有找到任何关于如何通知systemd手动启动进程的信息。我没有深入研究,但我认为有可能通过发送systemd有关进程启动的消息来实现,但这对我来说太复杂了。

答案3

systemd 只能跟踪自己启动的进程。如果通过 cmdline 启动了同一守护进程的另一个实例,systemd 则无法感知。

现在,即使您通过 systemctl 调用服务文件, ExecStart 也会失败(因为您已经通过 cmdline 启动了守护进程),并且 systemd 认为它没有成功启动您的守护进程。

要解决此问题,请先终止守护进程。然后通过 systemctl 调用服务文件以重新启动守护进程,状态应为活动状态

相关内容