在 systemd 脚本中分叉

在 systemd 脚本中分叉

我希望 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=simpleType=notify。然后 systemd 会为你进行分叉。

如果您可以修改swamp可执行文件,那么这Type=notify是最好的解决方案。当可执行文件成功初始化时,它应该通知 systemd。这意味着systemctl start swamp从命令行调用时将等待 swamp 初始化,并在初始化到命令行时打印任何错误消息,这正是您通常想要的。

有关使用 Type=notify 编写的可执行文件的示例,请参阅以下 shell 脚本:

#!/bin/bash                                                                     
sleep 3
systemd-notify READY=1
sleep 1000000

相关内容