为什么 systemd 没有降低依赖性?

为什么 systemd 没有降低依赖性?

我创建了一个 systemd 服务文件,它的任务没有任何作用,只是启动其他服务,并关闭它们。

由于它除了启动其他服务外什么也不做,所以我对ExecStart和进行了回显ExecStop

问题是,当我调用时,我可以看到依赖项已正常启动service <myService> start,但当我调用时它们并未停止service <myService> stop。即使使用也BindsTo不起作用。

这是我的服务配置文件:

[Unit]
Description=Starts the DCCA index software
Requires=mysql.service ifmFuseHandler.service
After=mysql.service ifmFuseHandler.service
BindsTo=mysql.service ifmFuseHandler.service

[Install]
WantedBy=multi-user.target

[Service]
ExecStart=/bin/sh -c "echo 'Index started'"
ExecStop=/bin/sh -c "echo 'Index stopped'"

# Execute pre and post scripts as root
PermissionsStartOnly=true
Restart=on-failure

TimeoutSec=600
Type=forking
RemainAfterExit=yes

解决方案: 按照建议,@grawity我创建了一个名为 index-start.target 的 .target 文件,如下所示:

[Unit]
Description=Starts the DCCA index software
Requires=mysql.service ifmFuseHandler.service
After=mysql.service ifmFuseHandler.service
BindsTo=mysql.service ifmFuseHandler.service

[Install]
WantedBy=multi-user.target

还有一个名为index.service的服务文件:

[Unit]
Description=Starts the DCCA index software
Requires=index-start.target
After=index-start.target

[Install]
WantedBy=multi-user.target index-start.target

[Service]
ExecStart=/bin/true
ExecStop=/bin/sh -c "echo 'Index stopped'"

# Execute pre and post scripts as root
PermissionsStartOnly=true
#Restart=on-failure (Commented as does not work with type=oneshot)

TimeoutSec=600
Type=oneshot
RemainAfterExit=yes

当被调用时,service index start它会启动依赖项并service index stop停止依赖项。

答案1

首先,你应该使用.target这里,不是虚拟服务。(对于虚拟服务,Type=oneshotExecStart=/bin/true比 更合适forking。)

BindsTo=(和PartOf=)需要在对面的方向 – 它的工作原理就像Requires=那样装置停止,如果上市单元消失。因此您需要将其添加到 mysql.service 和 ifmFuseHandler.service。(使用插件扩展默认的 mysql.service。)

答案2

感谢您的提问/解决方案,我找到了一个很好的解决方案,我想分享一下。
我的要求是有一个allservices.target可以启动/停止/重新启动srv1.servicesrv2.service和 的程序srv3.service

一个要求是,我可以停止例如srv1.service其他服务和目标之后仍在运行。

关键是要在srv*.services 中Wants的指令中包含服务.targetPartOf=allservices.target

所有服务.目标

[Unit]
Description=start allservices
Wants=syslog.target network.target srv1.service srv2.service srv3.service 
After=network.target
[Install]
WantedBy=multi-user.target

srv1.服务

[Unit]
Description=run srv1.service
Wants=syslog.target network.target
PartOf=allservices.target

[Service]
ExecStart=/path/to/bin/start
ExecStop=/bin/kill $MAINPID
Restart=always

[Install]
WantedBy=allservices.target

就像这样,在我点击 srv1-srv3 后,它们都启动了,和 也是systemctl start allservices.target一样。 如果我运行其他服务,目标仍然在运行。stoprestart
systemctl stop srv1.service

相关内容