systemd:未运行的可选依赖服务在父级重新启动时意外启动

systemd:未运行的可选依赖服务在父级重新启动时意外启动

我有3个服务:

  1. ParentService,它提供了我应用程序的大部分功能
  2. DependentServiceA 强烈依赖于 ParentService 的运行(也就是说,如果没有 ParentService,它实际上毫无用处)。当 DependentServiceA 运行时,其生命周期应与 ParentService 绑定(一起重启,一起停止)。
  3. 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 的发布历史中没有看到任何相关信息。)

相关内容