systemdでは、After =とRequires =の違いは何ですか?


54

私はsystemdに.serviceファイルを作成していると私は違い理解の助けを必要Requires=としますAfter=manページには、と言うRequires=「他のユニットで構成さの要件の依存関係。」そしてAfter=、「設定するには、ユニット間の依存関係を注文します。」違いは何ですか?

回答:


44

After=Requires=状態の依存関係中に、サービスの順序を構成します(Yの後にのみXを行います)。順序を指定しない場合、他のサービスに依存するサービスは、依存するサービスと同時に開始されます。また、私はそれを理解する方法(今はそれをテストすることはできず、参照を見つけることはできませんが)、After=「疎結合」であり、そのようなステートメントを持つサービスは、After=行で指定されたものが「まったく開始されRequire=ませんでしたが、要件が満たされない場合は開始されませんでした。

引用https://www.freedesktop.org/software/systemd/man/systemd.unit.html

必要=

他のユニットの要件依存関係を構成します。このユニットがアクティブになると、ここにリストされているユニットもアクティブになります。他のユニットの1つが非アクティブ化されるか、そのアクティブ化が失敗すると、このユニットは非アクティブ化されます。このオプションは複数回指定することも、1つのオプションで複数のスペースで区切られたユニットを指定することもできます。その場合、リストされているすべての名前の要件依存関係が作成されます。要件の依存関係は、サービスの開始または停止の順序に影響しないことに注意してください。これは、After =またはBefore =オプションで個別に設定する必要があります。ユニットfoo.serviceにRequires =で構成されたユニットbar.serviceが必要で、After =またはBefore =で順序付けが構成されていない場合、foo.serviceがアクティブになっている場合、両方のユニットが同時に遅延なく開始されます。しばしば、

そして

Before =、After =

ユニット名のスペース区切りリスト。ユニット間の順序の依存関係を構成します。ユニットfoo.serviceにBefore = bar.serviceの設定が含まれていて、両方のユニットが起動されている場合、bar.serviceの起動はfoo.serviceが起動されるまで遅延されます。この設定は、Requires =で構成された要件の依存関係とは独立しており、直交していることに注意してください。After =オプションとRequires =オプションの両方にユニット名を含めるのが一般的なパターンです。この場合、リストされたユニットは、これらのオプションで構成されたユニットの前に開始されます。このオプションは複数回指定できます。その場合、リストされているすべての名前の順序依存関係が作成されます。After =はBefore =の逆です。つまり、After =はリストされたユニットの起動が完了した後に構成済みユニットが起動されることを保証し、Before =は反対を保証します。リストされたユニットが開始される前に、構成されたユニットが完全に開始されること。順序依存関係のある2つのユニットがシャットダウンされると、起動順序の逆が適用されることに注意してください。つまり、ユニットが別のユニットでAfter =で構成されている場合、前者は両方がシャットダウンされると後者の前に停止します。順序に依存関係のある2つのユニットがある場合、1つのユニットがシャットダウンされ、もう1つのユニットが起動されると、起動前にシャットダウンが注文されます。順序の依存関係がAfter =かBefore =かは関係ありません。また、1つがシャットダウンされ、もう1つが起動される限り、2つのうちどちらがシャットダウンされるかは関係ありません。すべての場合において、シャットダウンは起動前に命令されます。2つのユニットの間に順序の依存関係がない場合、それらは同時にシャットダウンまたは起動され、


7
命令文ではない場合の依存関係とは何ですか?(真剣に...私は違いを理解していません)
-TomOnTime

編集をご覧ください。私の理解:After=X「Xが完了したら Xの後にこれを行う」Require=Xことを意味し、「Xを実行できない場合はこれをまったく行わない」ことを意味します。
スヴェン

Before=マニュアルページのセクションはこれを確認しているようです。If a unit foo.service contains a setting Before=bar.service and both units are being started, bar.service's start-up is delayed until foo.service is started up 私が理解しているように、bar.serviceとにかく開始されなければfoo.service正常に開始される場合、順序付けは強制されません。
スヴェン

10

大きな違いの1つは、

  • After ユニットがすでにアクティブ化されているかどうかのみをチェックし、指定されたユニットを明示的にアクティブ化しません。
  • にリストされRequiresているユニットは、ユニットとともにアクティブになります。必要なユニットのいずれかが起動に失敗した場合、ユニットはアクティブ化されません。

ユニットファイルがあるとしますtest-app.service

[Unit]
Description=test app
After=network-online.target

このステートメントが実行されると、次のようになります。

  • Afterをチェックしますnetwork-online.target
  • network-online.target開始されていない場合、待機します。
  • test-appnetwork-online.targetアクティブになった後にのみ開始

私がRequires代わりに持っていた場合、

[Unit]
Description=test app
Requires=network-online.target

このステートメントが実行されると、次のようになります。

  • network-online.targetそして、test-app一緒に活性化します
  • 場合は、network-online.target起動に失敗したtest-appアクティブ化されることはありません。

2

systemdはジョブマネージャーです。manページは、物事がどのように機能するかに関してあまり正確ではありません。

起動すると、systemdはアンカージョブのジョブで構成されるトランザクションを構築します(つまり、default.targetのジョブを開始します)。これらのすべての依存関係と関係は、どのように、どのジョブがトリガーされるかを定義します。順序付けは、他のすべてのジョブが待機するジョブを定義します。したがって、default.targetユニットはこのすべての中心にあります。ユニットを有効にするとき、systemctl enableを介してsystemdが従うことができる前方依存関係を示すファイルシステムシンボリックリンクを作成する逆依存関係を使用する理由です(ファイルシステムシンボリックリンクが必要な理由もあります)最初の場所)。同様に、あるユニットを手動で起動し、そのユニットがアンカーであり、トランザクションがそれに対して計算される場合です。

あまり詳しく説明しませんが、Requires =とAfter =が何をするかを説明します。

Requires =を指定すると、開始ジョブが(明示的に、または依存関係を介して:内部で区別されない)トリガーされると、systemdが必要なユニットの開始ジョブをトリガーします。また、このユニットが停止(注:停止、それ自体で停止しない)または再起動したときに、停止ジョブをトリガーするプロパティがあります。これは、何らかの依存関係/ systemctlによって停止/再起動が発生した場合、停止/再起動することを意味します。ただし、それが単独でダウンした場合、ジョブがなかったため停止せず、状態変更はsystemdの関与なしに発生しました。そこで、BindsTo =を使用します(明らかな理由により、systemdの関与なしに非アクティブになるデバイスユニットに似ています)。

現在、Requires =だけで何をするのかが重要なので、After =の使用をお勧めします。開始ジョブが失敗した場合はrequireeをキャンセルします。ただし、このキャンセルはwrtジョブでのみ機能します。つまり、他のユニットが順序を定義していない場合、systemdは両方を同時にトリガーし、開始ジョブが失敗する前に開始ジョブが終了した場合、キャンセルされません(実際にはキャンセルできません) 。After =を使用すると、必要なユニットの開始ジョブが終了するまで他のジョブが待機し、結果に応じて、失敗した場合、ユニットの待機開始ジョブはJOB_DEPENDENCYジョブ結果でキャンセルされます(黄色[DEPEND]を使用する理由)そのような場合のブート時)。したがって、この無効化の効果は、After =を使用しないと不確定です。

他のユニットの起動を待ちたくない場合、After =を使用せずにWants =を使用するのが良い理由です。その場合、同期メカニズムにすぎません。

また、起動時に両方を有効にし、お互いを必要とせず、順序のみを定義できます。その場合、両方が同じトランザクションの一部としてプルされると、それらは順序付けされます(または、他方のジョブがトリガーされた場合後に実行するユニットのジョブが実行されている間、トランザクション全体で最初に完了するまで待機します)。

仕事がない場合、注文はそのユニットに影響しません。ただし、Requires =やWants =などの依存関係を使用した結果として、通常はジョブが存在します。または、一度にプルされて順序を定義します。その場合、別のユニットのジョブを待機します。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.