![为什么 systemd 没有降低依赖性?](https://linux22.com/image/1480221/%E4%B8%BA%E4%BB%80%E4%B9%88%20systemd%20%E6%B2%A1%E6%9C%89%E9%99%8D%E4%BD%8E%E4%BE%9D%E8%B5%96%E6%80%A7%EF%BC%9F.png)
我创建了一个 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=oneshot
和ExecStart=/bin/true
比 更合适forking
。)
BindsTo=
(和PartOf=
)需要在对面的方向 – 它的工作原理就像Requires=
那样这装置停止,如果上市单元消失。因此您需要将其添加到 mysql.service 和 ifmFuseHandler.service。(使用插件扩展默认的 mysql.service。)
答案2
感谢您的提问/解决方案,我找到了一个很好的解决方案,我想分享一下。
我的要求是有一个allservices.target
可以启动/停止/重新启动srv1.service
、srv2.service
和 的程序srv3.service
。
一个要求是,我可以停止例如srv1.service
其他服务和目标之后仍在运行。
关键是要在srv*.services 中Wants
的指令中包含服务.target
PartOf=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
一样。 如果我运行其他服务,目标仍然在运行。stop
restart
systemctl stop srv1.service