我有3个服务:
- ParentService,它提供了我应用程序的大部分功能
- DependentServiceA 强烈依赖于 ParentService 的运行(也就是说,如果没有 ParentService,它实际上毫无用处)。当 DependentServiceA 运行时,其生命周期应与 ParentService 绑定(一起重启,一起停止)。
- DependentServiceB 松散地依赖于 ParentService(即,大多数功能都与 ParentService 绑定,但没有 ParentService 仍然有用)。DependentServiceB 的生命周期不应受到 ParentService(或 DependentServiceA,自然)的影响。它应该优先在 ParentService 之后启动。
预期行为
- 如果 ParentService 是冷启动的(即未重新启动)
- 不启动依赖服务
- 如果 ParentService 重新启动
- 重新启动 DependentServiceA如果它已在运行;否则不要启动它
- 对 DependentServiceB 不执行任何操作
- 如果 ParentService 停止
- 如果 DependentServiceA 已在运行,则停止它
- 对 DependentServiceB 不执行任何操作
这一切都适用于:
- CentOS 6(带有由 SysVinit 调用的初始化脚本)
- CentOS 7(带有 systemd 219)
- RedHat 7(带有 systemd 219)
- Ubuntu 16.04 LTS(带有 systemd 229)
问题
这确实不是从事于:
- Debian 8/Jessie(带有 systemd 215)
在 Debian 8 上,如果我关于当 DependentServiceA 启动 ParentService不是正在运行,DependentServiceA 无论如何都会启动。仅当开始家长服务。
我已将我的 systemd 文件附加到下方以供审查。我几乎可以肯定这是 DependentServiceA 单元文件中的问题,但我承认我并不完全了解 systemd 依赖项指令(例如 BindsTo、PartOf、WantedBy)之间的所有差异。
家长服务
[Unit]
Description=Parent service
BindsTo=network.target
After=network.target
Before=soss_svc_rest.service dependent_service_b.service
[Service]
Type=forking
ExecStart=/usr/local/foobar/parent_service
KillMode=process
Restart=on-failure
PIDFile=/var/run/parent_service.pid
[Install]
WantedBy=multi-user.target
WantedBy=dependent_service_a.service
依赖服务A
[Unit]
Description=Dependent Service A
BindsTo=network.target
After=network.target
After=parent_service.service
BindsTo=parent_service.service
PartOf=parent_service.service
[Service]
Type=forking
PIDFile=/var/run/dependent_service_a.pid
ExecStart=/usr/local/foobar/dependent_service_a
KillMode=process
Restart=on-failure
[Install]
WantedBy=multi-user.target
依赖服务B
[Unit]
Description=Dependent Service B
BindsTo=network.target
After=network.target
After=parent_service.service
[Service]
Type=forking
PIDFile=/var/run/dependent_service_b.pid
ExecStart=/usr/local/foobar/dependent_service_b
KillMode=process
Restart=on-failure
[Install]
WantedBy=multi-user.target
如果相关,则 ParentService 和 DependentServiceB 被标记为已启用(我希望它们在系统启动时启动),但是 DependentServiceA 设置为已禁用默认情况下,应明确启动和/或设置为已启用由用户在系统启动时启动。
我在 systemd 单元文件中错误地配置了哪些内容,导致 DependentServiceA 在 ParentService 重新启动时启动(之前没有运行)?为什么这种情况只发生在 Debian 8 上,而我测试过的其他发行版都没有发生这种情况?这是 Debian 8 的 systemd(版本 215)中的一个错误,在版本 216 和 219 之间已修复?(我在 systemd 的发布历史中没有看到任何相关信息。)