设置

设置

设置

我有两项服务,基本上是互补的。

服务A(gdm)是一个守护进程;服务B只触发一个ExecStart=ExecStop=

service-b-hdmi.service
-------------------------
[Unit]
Description=Turn off HDMI
Conflicts=gdm.service

[Service]
Type=oneshot
RemainAfterExit=yes
ExecStart=/usr/bin/bash -c '/bin/echo off > /sys/class/drm/card0-DP-1/status'
ExecStop=/usr/bin/bash -c '/bin/echo on > /sys/class/drm/card0-DP-1/status'

启动条件

  • 服务 A (gdm) 是停止了
  • 服务 B (HDMI) 是开始了“活动(退出)”(关闭hdmi卡)

问题

  • 启动服务 A (gdm) 应停止服务 B,因为两者存在冲突。
  • 然而,服务 B 生活得很幸福,现在两个服务都处于活动状态。服务 A 处于“活动(运行)”状态,服务 B 处于“活动(退出)”状态

问题

有没有办法强制执行Conflicts=

答案1

文档说这个:

如果一个单元Conflicts=在另一个单元上有设置,则启动前者将停止后者,反之亦然。

因此,如果 'service-b-hdmi.service' 包含Conflicts=gdm.service,启动 'service-b-hdmi.service' 将导致 'gdm.service' 停止。

为了使这项工作反向工作 - 这就是您似乎面临问题的地方 - 您需要Conflicts=service-b-hdmi.service在单元文件中添加“gdm.service”。然后,启动“gdm.service”将导致“service-b-hdmi.service”停止,这似乎是预期的行为。

该文档还建议使用After=Before=强制执行排序 - 确保一个单元在另一个单元启动之前完全关闭。当两个单元都启动或关闭时,排序逻辑稍微复杂。然而,在这种情况下,一个单元正在关闭,而另一个单元正在启动。systemd在启动作业之前安排所有关闭作业,因此在这种情况下,两者Before=After=具有相同的效果。同样,您需要在两个单元文件上设置属性。

相关内容