systemd “Requires=” オプションについて

systemd “Requires=” オプションについて

systemd.unit(5)このオプションの意味は次のとおりですRequires=

他のユニットの要件依存関係を構成します。このデバイスがアクティブになると、ここにリストされているデバイスもアクティブになります。他のデバイスのいずれかが無効または有効になっていない場合、このデバイスは無効になります。

私はこれについていくつかの実験をしました。私は2つのサービスを作りa.serviceましたb.service

# cat a.service
[Service]
ExecStart=/bin/false

# cat b.service
[Unit]
Requires=a.service

[Service]
ExecStart=/bin/sleep 1000

私がこれをした後

systemctl start b.service

失敗は失敗し、失敗は失敗するため、どちらもa.service失敗すると予想します。b.servicea.service/bin/falseb.servicea.service

ただし、b.service実行中:

root@john-ubuntu:/etc/systemd/system# systemctl status a.service b.service
● a.service
   Loaded: loaded (/etc/systemd/system/a.service; static; vendor preset: enabled)
   Active: failed (Result: exit-code) since Thu 2017-09-07 16:38:39 CST; 2s ago
  Process: 1245 ExecStart=/bin/false (code=exited, status=1/FAILURE)
 Main PID: 1245 (code=exited, status=1/FAILURE)

Sep 07 16:38:39 john-ubuntu systemd[1]: Started a.service.
Sep 07 16:38:39 john-ubuntu systemd[1]: a.service: Main process exited, code=exited, status=1/FAILURE
Sep 07 16:38:39 john-ubuntu systemd[1]: a.service: Unit entered failed state.
Sep 07 16:38:39 john-ubuntu systemd[1]: a.service: Failed with result 'exit-code'.

● b.service
   Loaded: loaded (/etc/systemd/system/b.service; static; vendor preset: enabled)
   Active: active (running) since Thu 2017-09-07 16:38:39 CST; 2s ago
 Main PID: 1244 (sleep)
    Tasks: 1
   Memory: 88.0K
      CPU: 696us
   CGroup: /system.slice/b.service
           └─1244 /bin/sleep 1000

Sep 07 16:38:39 john-ubuntu systemd[1]: Started b.service.

私が逃したものは何ですか?ありがとうございます。

ベストアンサー1

これはトリッキーです。理解すべき最も重要なことは、systemdが指示しない限り、すべてを並列に開始することです。これは実際にはマニュアルページの「要件」セクションに記載されています。

要件の依存関係は、サービスの開始または停止の順序には影響しません。

あなたが達成したいのは、「a.serviceが始まるまで待つことです。今後b.service"を起動します。これには"require"が必要です。そしてb.serviceファイルの「以降」オプション:

[Unit]
Requires=a.service
After=a.service

[Service]
ExecStart=/bin/sleep 1000

=更新=

さて、何が間違っているのか理解しています。 a.serviceファイルに型を指定せずにExecStartコマンドを配置しました。これは、型がデフォルトで「単純」に設定されることを意味します。機能するには「forked」タイプが必要です。 systemd.serviceのマニュアルページから:

simpleに設定すると(Type =またはBusName =が指定されていないがExecStart =が指定されている場合はデフォルト)、ExecStart =で構成されたプロセスはサービスの基本プロセスになると予想されます。このモードでプロセスがシステム内の他のプロセスに機能を提供する場合は、対応する通信チャネル(たとえば、ソケットのアクティブ化によってsystemdによって設定されたソケット)は、以下のようにデーモンが起動する前にインストールする必要があります。systemd は直ちに後続のデバイスの実行を開始します。

ブランチに設定されている場合、ExecStart =で設定されたプロセスは開始の一部としてブランチ()を呼び出す必要があります。起動が完了し、すべての通信チャネルが確立されると、親プロセスが終了すると予想されます。子プロセスは引き続きデフォルトデーモンとして実行されます。これは従来のUNIXデーモンの動作です。この設定を使用する場合は、systemdがデーモンのデフォルトプロセスを識別できるように、PIDFile =オプションも使用することをお勧めします。 親プロセスが終了すると、systemd は引き続き後続のユニットを起動します。

したがって、「Type = Forking」を含むようにa.serviceファイルを更新する必要があります。

[Service]
Type=forking
ExecStart=/bin/false

これはうまくいきます。 :)

おすすめ記事