systemdでパラメータを使用してサービスへの依存関係を作成するには?

systemdでパラメータを使用してサービスへの依存関係を作成するには?

Type=notifyサービスBが起動する前に初期化する必要があるサービスAがあります。サービスAがダウンした場合、サービスBもそれに従う必要があります。問題は、Aサービスの名前が明確に定義されていないことです。これは[email protected]

これは私のサービスユニットBです

[Unit]
Description=start and shutdown with Service A
[email protected]
[email protected]

[Service]
Type=oneshot
RemainAfterExit=yes
ExecStart=/usr/bin/myprogram --start
ExecStop=/usr/bin/myprogam --stop

サービスコールの例は次のとおりです。

sudo systemctl start [email protected]

しかし、myarg実際には何でもできるので、サービスBからサービスAのハンドルを取得する方法は混乱しています。

編集:これは意図された機能なRequiresので編集中です。BindsTo

それでも動作しません。存在するsudo systemctl status service.B

service.B.service:3: openvpn-client@service に依存関係を追加できません。無視:不明なエラー-22

編集: 部分的な解決。

service.Bでテンプレートサービス(service.A)を参照する代わりに、テンプレートサービスでservice.Bを参照して必要な依存関係を作成できます。

だからサブ..ワンユニット..

[Unit]
Before=service.B
Requires=service.B

[Service]
Type=notify
ExecStart=/usr/sbin/some.program

したがって、service.Aにはservice.Bが必要であり、service.Bの前に開始する必要があります。 この部分は機能しますが、サービスAが終了するとサービスBは終了しません。

答え1

どうすればいいのか誤解があります。システム働くあなたのライン[email protected]ラインサービス.B.サービス誤って使用されています。次の行を削除してください。サービス.B.サービス依存関係を追加し、[Eメール保護]良いRequires=service.B.service

systemD文書を注意深く読んでください。ここから始めることをお勧めします。

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

あなたにとって最も興味深い部分は[単位] 一部のオプション。注意深く読んでください!

必要=

...

このデバイスがアクティブになると、リストされたデバイスもアクティブになります。他のデバイスのいずれかがアクティブではなく、注文の依存関係After =が失敗したデバイスに設定されている場合、そのデバイスは起動しません。また、After =を指定するかどうかにかかわらず、他のデバイスの1つが明示的に停止(または再起動)されると、このデバイスは停止(または再起動)されます。

...

答え2

[email protected]テンプレートサービス()を参照する代わりに、テンプレートサービスで必要な依存関係を作成できます。service.Bservice.B

だから[email protected]ユニットは...

[Unit]
Before=service.B
Requires=service.B

[Service]
Type=notify
ExecStart=/usr/sbin/some.program
ExecStop=systemctl stop service.B

したがって、[email protected]この作業は以前に開始し、service.B開始する必要がありますservice.B。また、ExecStopその前に停止してください。service.B[email protected]

私はこの解決策に完全に満足していません。 ExecStopは昔ながらのようです。service.B代わりに私のものなので、依存関係を作成して変更で更新できます。依存関係のテンプレートサービスを参照する方法を学びませんでした。service [email protected]

編集:[email protected]私のものではないので、私の変更を更新できます。したがって、より良い方法はsystemd overrideを使用することです。

sudo systemctl edit [email protected]

[Unit]
Requires=service.B.service
Before=service.B.service

[Service]
# From docs, I think, options with lists need to be reset first
ExecStop=
ExecStop=systemctl stop service.B.service

関連情報