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=。彼らはすべて同じことを達成します。

答え2

ありがとうパトリックそのような説明的な答えは私の疑いのいくつかを解決しました。

ありがとう知りたい私に代わってテストしてみてください。

〜のようにパトリック答えは、未定義の順序で誤動作する可能性があると述べました。ディレクトリがすでに存在し削除されていないため、B.service実行できません。mkdirA.service

  1. 順序を定義できます。どちらが最初に開始されても、現在の要件に応じて同じように機能します。

  2. あるいは、pid両方のサービスに対して別々のファイルを作成し、ディレクトリの代わりにファイルを削除することもExecStopPostできます。pid

2番目のアプローチに従う場合は、これが必要ではないことに注意してくださいExecStartPre

init.d参考までに、いくつかのスクリプトを見た後にpidファイルを保存するのに最適な場所は、追加の/var/run/ディレクトリを作成しないことです。その場所はルートに対してのみ書き込み禁止になっているため、サービスがルートとして起動した場合にのみ機能します。

関連情報