我希望 systemd 服务来处理分叉(我的文件本身不处理分叉。所以我依靠 systemd 来处理它)
我的.service 文件:
[Unit]
Description=swamp services management service
After=syslog.target
[Service]
Type=forking
ExecStart=/usr/bin/swamp
[Install]
WantedBy=multi-user.target
问题
Type=forking
对于我想要实现的目标来说,指定足够了吗?或者它是否类似于在 upstart 中期待分叉,它实际上告诉 upstart (如果我理解正确,不确定我是否理解,我是编写初始化脚本的新手)我的服务将处理分叉/守护进程。
答案1
systemd 有优秀的文档。请参阅页面服务文件:
如果设置为 forking,则预计使用 ExecStart= 配置的进程将调用 fork() 作为其启动的一部分。当启动完成并且所有通信通道都建立后,父进程预计将退出。子进程继续作为主守护进程运行。这是传统 UNIX 守护程序的行为。如果使用此设置,建议同时使用 PIDFile= 选项,以便 systemd 可以识别守护进程的主进程。一旦父进程退出,systemd 将继续启动后续单元。
因此,使用它type
只会告诉 systemd 等待swamp
返回,然后认为它仍在运行:实现这一点仍然是你的责任......
答案2
如果您希望 systemd 处理分叉,那么您应该使用 例如Type=simple
或Type=notify
。然后 systemd 会为你进行分叉。
如果您可以修改swamp
可执行文件,那么这Type=notify
是最好的解决方案。当可执行文件成功初始化时,它应该通知 systemd。这意味着systemctl start swamp
从命令行调用时将等待 swamp 初始化,并在初始化到命令行时打印任何错误消息,这正是您通常想要的。
有关使用 Type=notify 编写的可执行文件的示例,请参阅以下 shell 脚本:
#!/bin/bash
sleep 3
systemd-notify READY=1
sleep 1000000