web-dev-qa-db-ja.com

複数のAfterを含むsystemdサービス

他のいくつかのサービスに依存するサービスを作成することは可能ですか?正しい構文は何ですか?

といった:

[Unit]
Description=service description
Wants=network.target
After=network.target
After=syslog.target

[Service]
User=bootapp
ExecStart=/var/app/app.jar
SuccessExitStatus=143

[Install]
WantedBy=multi-user.target

目標は、OSの再起動後にサービスを自動的に開始し、サービスの前にロギングサービスとネットワーキングサービスが開始されていることを確認することです。

追加の質問:Restartを指定する必要がありますか?

3
naXa

投稿したユニットファイルは正常です。しかし、ここで定義したユニットには、厳密な依存関係はなく、弱いだけです(Wants=ではなくRequires=)。つまり、network.targetが存在しない場合、または起動に失敗した場合でも、このユニットは起動されます。 After=(およびBefore=)は、順序付けにのみ使用され、依存関係の管理には使用されません。したがって、アプリがneeds別のサービスである場合は、Requires=を使用します。そのサービスが必要な場合before自分で開始できる場合は、さらにAfter=を使用します。

起動後にユニットが自動的に起動するようにするには、それを有効にする必要があります。 Systemdはそれを開始するためにどこにリンクするかを知る必要があります。それがWantedBy=セクションの[Install]の使用目的です。ユニットファイルを編集して/etc/systemd/system/my-unit.serviceに保存した後、有効にする前に、systemdデーモンをリロードして新しいユニットを取得する必要があります。コマンドはsystemctl daemon-reloadです。ユニットを有効にするには、systemctl enable my-unit.serviceと入力します。これにより、/etc/systemd/system/multi-user.target.wants/のシンボリックリンクがユニットファイルに追加されます。

手動で開始するには、systemctl start my-unit.serviceと入力します。

Restart=は、アプリが終了したときに自動的に再起動する場合にのみ必要です。 on-failurealwayssystemd.serviceのmanページで詳細)のように、再起動するタイミングにはさまざまな可能性があります。

また、これを機能させるには、app.jarが実行可能である必要があります。それがあり、それがあなたのアプリを起動するなら、それは問題ありません。 jarはsthで開始する必要があると思います。 Java -jar app.jarに似ていますが、ofcです。私はここで間違っている可能性があります。

7
nix