有一个守护进程可以从命令行和 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 调用服务文件以重新启动守护进程,状态应为活动状态