在systemd脚本中分叉


10

我希望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(如果我理解正确,但不确定,我是新手,那么我在编写初始化脚本时就知道)我的服务将处理分叉/守护进程。

Answers:


16

systemd具有出色的文档。请参阅服务文件页面:

如果设置为派生,则预期使用ExecStart =配置的进程将在其启动过程中调用fork()。启动完成并设置所有通信通道后,预计父进程将退出。子级继续作为主守护进程运行。这是传统UNIX守护程序的行为。如果使用此设置,建议也使用PIDFile =选项,以便systemd可以识别守护程序的主进程。一旦父进程退出,systemd将继续启动后续单元。

因此,使用它type只会告诉systemd等待swamp返回,然后认为它仍在运行:做到这一点仍然是您的责任...


5
如果脚本不进行任何派生,则为oneshot(典型的短期运行脚本)或simple(不进行分叉+退出的长期运行服务)。
PavelŠimerda2014年

4
当脚本(" Bash?)在后台使用&符号时,您是否会考虑分叉另一个进程&
菲利佩·阿尔瓦雷斯

5
@FelipeAlvarez是的,bash中的&运算符等效于fork和exec。
Thayne

1

如果希望systemd处理分支,则应使用eg Type=simpleType=notify。然后systemd将为您做分叉。

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

有关使用Type = notify编写的可执行文件的示例,请参见以下shellscript:

#!/bin/bash                                                                     
sleep 3
systemd-notify READY=1
sleep 1000000
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.