設定

設定

設定

基本的に補完的な2つのサービスがあります。

サービス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=実行して、他のデバイスが起動する前にあるデバイスが完全にシャットダウンされることをお勧めします。両方のデバイスの電源をオンまたはオフにすると、シーケンスロジックがやや複雑になります。ただし、この場合、1つのデバイスがシャットダウンし、もう1つのデバイスが起動します。systemdすべての終了操作は開始操作の前にスケジュールされているため、この場合Before=と両方がAfter=同じ効果を持ちます。今回も両方のユニットファイルにプロパティを設定する必要があります。

おすすめ記事