Linux Systemdの競合がExecStopPostを使用していないようです。

Linux Systemdの競合がExecStopPostを使用していないようです。

サービス

[Unit]
Description = A-service
Conflicts= B.service
After = network.target

[Service]
PermissionsStartOnly = true
PIDFile = /run/AB/ab.pid
User = root
WorkingDirectory = /root/AB_services
ExecStartPre = /bin/mkdir /run/AB
ExecStartPre = /bin/chown -R root:root /run/AB
ExecStart = /usr/bin/python test_A.py --pid /run/AB/ab.pid
ExecReload = /bin/kill -s HUP $MAINPID
ExecStop = /bin/kill -s TERM $MAINPID
ExecStopPost = /bin/rm -rf /run/AB
PrivateTmp = true

[Install]
WantedBy = multi-user.target

私。サービス

[Unit]
Description = B-Service
Conflicts = A.service
After = network.target

[Service]
PermissionsStartOnly = true
PIDFile = /run/AB/ab.pid
User = root
WorkingDirectory = /root/AB_services
ExecStartPre = /bin/mkdir /run/AB
ExecStartPre = /bin/chown -R root:root /run/AB
ExecStart = /usr/bin/python test_B.py --pid /run/AB/ab.pid
ExecReload = /bin/kill -s HUP $MAINPID
ExecStop = /bin/kill -s TERM $MAINPID
ExecStopPost = /bin/rm -rf /run/AB
PrivateTmp = true

[Install]
WantedBy = multi-user.target

最初に起動しましたが、A.service正常に起動しました。しかし、始めると終わりB.serviceが見えますA.service。しかし、ExecStopPost次のエラーが発生して実行されないようです。

/bin/mkdir: cannot create directory ‘/run/AB’: File exists

ExecStopPost本当に不可能なことですかConflicts? ?

ありがとうございます。

ベストアンサー1

2 つのサービス間でソート制約を指定していません。したがって、何が起こっているのかは、停止B.service(および実行)が完了する前に開始(および実行)されることです。関連部分mkdirA.servicerm
systemd.unit ドキュメント:

衝突=
この設定はAfter =およびBefore =順序依存関係とは無関係であり、直交していることに注意してください。

 

解決策は、各サービスAfter=リストに異なるサービスを追加することです(A.serviceその逆も同様です)。関連セクションも参照してください。B.serviceAfter=
文書:

前 =、後 =
2つのデバイス間の順序依存関係を考慮して、1つのデバイスがシャットダウンし、別のデバイスが起動すると、シャットダウン順序は開始順序よりも優先されます。この場合、順序の依存関係がAfter =かBefore =かは重要ではありません。どちらをオフにするかは問題ではありません。 1つだけオフにしてもう1つを起動します。すべての場合において、開始前に終了が命令されます。

After=^は、使用するかどうかが重要ではないことを意味しますBefore=。彼らはすべて同じことを達成します。

おすすめ記事