Systemd

systemd.service ‘Conflicts=’ 只關心“執行”服務而不是“活動”服務。任何解決方法

  • October 25, 2022

設置

我有兩個基本上是互補的服務。

服務 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=

文件是這樣說的:

如果一個單元在另一個單元上有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=具有相同的效果。同樣,您需要在兩個單元文件上設置屬性。

引用自:https://unix.stackexchange.com/questions/722307