我有“服务A”和“服务B”。 “serviceA”每 12 小时运行一次,带有计时器,“serviceB”每 15 分钟运行一次。我想确保如果“serviceB”当前正在运行,则“serviceA”永远不会运行,反之亦然。我还想确保“serviceA”在被触发并且“serviceB”当前正在运行时不会杀死“serviceB”。
我怎样才能用systemd做到这一点?
答案1
使用执行开始前:
从联机帮助页 ExecStartPre 条目:
如果这些命令中的任何一个(不带“-”前缀)失败,则其余命令不会执行,并且该单元被视为失败。
服务A
[Unit]
Description=Service A 12 hours on timer
[Service]
Type=oneshot
# Check and see if serviceB is running
ExecStartPre="! systemctl is-active --quiet serviceB"
Restart=no
...
服务B
[Unit]
Description=Service B 15 mins on timer
[Service]
Type=oneshot
# Check and see if serviceA is running
ExecStartPre="! systemctl is-active --quiet serviceA"
Restart=no
...
冲突
如果使用该Conflicts
指令,则当设置了该指令的服务启动时,指定的一个或多个服务将停止。您提到:
我还想确保“serviceA”在被触发并且“serviceB”当前正在运行时不会杀死“serviceB”。
然而,从联机帮助页来看,这是一种双向关系:
如果一个单元在另一个单元上有 Conflicts= 设置,则启动前者将停止后者,反之亦然。
所以你必须避免冲突指令。