systemdで一方向にのみ衝突を設定する方法

systemdで一方向にのみ衝突を設定する方法

A2つのシステムサービス(数分かかります)とB(数秒かかります)があります。

  • A優先順位が高く、すべての状況で実行する必要があります。
  • BAランタイムは開始されませんが、依然として問題なくランタイムが開始されます。すべての場合に実行している必要があるため、実行中でも起動したい場合があります。ABABA
  • BConflicts=サービスが停止したときにサービスを終了してはいけませんが、代わりに実行を完了する必要があります。

これシステム人教えてください:

否定的な要件依存関係を構成します。あるユニットが別のユニットに衝突=を設定した場合、前者を起動すると後者は停止します。その逆に

Conflicts=A.service使用することが解決策になる可能性があると思います。男性は始めたところでA止まると言いますがB、私が望んでいないのはそれがB止まるということですA

Conflicts=一方向だけを持つ方法はありますか?

答え1

このコマンドは双方向で動作するだけでなく、起動時に現在実行中のジョブ(実行中の場合)を停止したくConflict=ないため、実際には望ましくありません。B.serviceA.service

これを達成するために私が提案する方法は、実行中であることをB.service確認してA.serviceからB.service、この場合は起動しないようにする追加のスクリプトを追加することです。

ゼロ以外の状態の終了を追加することでこれを行うことができますExecStartPre=。これにより、起動プロセスでこれ以上進行しなくなります。B.service

私の提案は、既存の項目に次のものを追加することです/etc/systemd/system/B.service

ExecStartPre=/bin/sh -c 'if systemctl -q is-active A.service; then \
                             echo "A.service already running, will not start B.service"; \
                             exit 75; \
                         fi'

これは以下を使用します。systemctl is-activeA.service現在のサービスが実行されていることを確認してください。

そうでない場合は、メッセージを表示します(このメッセージは最終的にログに表示され、さらに重要なことは確認するたびに表示されますsystemctl status B.service)、ゼロ以外の状態で終了します。 systemdがEX_TEMPFAIL「一時的な失敗、ユーザーが再試行するように招待されました」という意味のコードを表示するため、終了コード75を選択しました。バラよりここsystemdがプロセス終了コードを解釈して名前を付ける方法を学びます。

改行もオプションです。すべての内容を1行に作成し、\後の改行を省略するだけです。

関連情報