如果另一个服务启动或重新加载,则系统单元服务将重新启动


16

我想知道在开始或重新加载时是否有Systemd重启A.serviceAfter)的方法B.service(仅限重新加载配置),如果可能的话,无需编辑B.service系统安装和升级的内容。

A.service即使B.service未安装,禁用或停止,也应启动。

A.service

[Unit]
After = B.service network-online.target
Wants = B.service

[Service]
Type=oneshot
ExecStart = /script.sh start
ExecStop = /script.sh stop
RemainAfterExit=yes

[Install]
WantedBy = network-online.target

B.service

[Unit]
After=syslog.target network.target

[Service]
Type=forking
ExecStart=/cmd start
ExecStop=/cmd stop
ExecReload=/cmd reload
PIDFile=/var/run/cmd.pid

[Install]
WantedBy=multi-user.target

Answers:


12

您可以PartOf在该[Unit]部分中使用。

例: PartOf=B.service

在手册页中,

PartOf =

配置与Requires =类似的依赖项,但仅限于停止和重新启动单元。当systemd停止或重新启动此处列出的单元时,操作将传播到该单元。请注意,这是单向依赖性,对此单位的更改不会影响列出的单位。


谢谢,我一直在寻找到Overriding vendor settings但这看起来更加轻松和有前途的,只有错误时抛出是我不想A停止,如果B停止,只是A.restart如果B.start,反正我很快就会做一些测试,看看是否有一些方法来管理它,然后会让您知道
Alex

@Alex:如果你使用什么PartOfRestart=always在一起?
2013年

我正在查看Restart=文档,我不确定oneshot服务的行为是什么,但是无论如何:When the death of the process is a result of systemd operation (e.g. service stop or restart), the service will not be restarted如果我正确理解手动停止B会停止A
Alex

好吧,赏金自动分配为过期,@Thushi我很感谢您的努力和建议,但这PartOf不是解决问题的方法,反正还是很享受的。
亚历克斯

@Alex:好吧,积分对我来说并不重要。我还有很多其他方式可以赚取积分。我只想知道提供的解决方案是否可以解决您的问题。如果没有,我们将继续进行下去。PartOf与一起使用怎么样Restart=always?你有尝试过吗?
2013年

3

我没有控制stopPartOf=,并A不得与停止B,所以我结束了使用重写供应商的设置,似乎工作。

/etc/systemd/system/B.service.d/override.conf

[Service]
ExecStart=
ExecStart=/bin/sh -c '/cmd start || exit $?; sleep 5; [ -x /script.sh ] && /script.sh start; exit 0'
ExecReload=
ExecReload=/bin/sh -c '/cmd reload || exit $?; sleep 5; [ -x /script.sh ] && /script.sh start; exit 0'

/cmd实现是异步的,并且也访问/script.sh需要访问的资源,所以我发现没有什么比现在更好的了。

systemctl [--no-block] try-restart/script.sh直接使用之前尝试使用,但是没有用。


我也在寻找这种情况的解决方案。您能否再解释一下该解决方案?或提供指向某些文档的链接,以阅读和了解您的工作。
zappy

@zappy,您好,请查找手册man systemd.unit(如果未安装,请在线搜索),并查找“覆盖供应商设置”一章。
亚历克斯

谢谢您的意见。我了解您选择上述方法仅是因为服务B是特定于供应商的,并且您不想编辑该服务文件。但就我而言,服务A和B都不由供应商提供。我觉得覆盖它可能会增加系统的复杂性。我们还有其他选择吗?
zappy

问题是几岁了,您检查文档了吗?此后可能已经涵盖了这种情况。当时我很着急,但是有时间我会寻找系统化的官方邮件列表并询问那里,最终提出一个问题
Alex

1

目前,systemd尚未涵盖该主题。您不能仅通过服务文件来实现此功能。一种可能是通过具有相同名称的shell脚本劫持systemctl,然后检查是否要重新启动/重新加载B.service,也对A.service进行适当的操作,并在需要时更新rc.local也可以在启动时进入正确的状态。我在docker.service和networking.service中遇到这个问题,但我总是总是一起重新启动它们:

systemctl重新启动docker.service网络。服务

显然,如果systemd本身在内部(例如,通过其他服务文件)操纵B.service,这将是无效的。

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.