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.B
service.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