あるサービスでエラーが発生した場合は、もう一方のサービスも再起動したいので、基本的に接続されているサービスセットがあります(理想的には単一のサービス/プロセスで実行する必要がありますが、まだ実行する必要があります)。
ターゲットセルを使用して同時にすべて開始し、Restart=always
個別に回復するように設定しましたが、何らかの理由であるサービスが失敗した場合、他のサービスは再起動されませんでした。
BindsTo
単一のサービスが失敗した場合(プロセスが終了した場合など)、すべてのサービスを停止しているように見えるこのディレクティブを使用すると問題がない可能性があると思いました。
私のサービスファイルは現在次のとおりです。
[Unit]
Description=foo
After=syslog.target network.target
BindsTo=foo.service bar.service baz.service all-services.target
[Service]
User=foo
WorkingDirectory=~
Restart=always
RestartSec=90
StartLimitInterval=400
StartLimitBurst=3
SyslogIdentifier=foo
ExecStart=/path/to/binary
[Install]
WantedBy=all-services.target
グループ化対象は次のように定義されます。
[Unit]
Description=all-services
BindsTo=foo.service bar.service baz.service
ただし、このBindsTo
ディレクティブは、1つのサービスが失敗した場合、すべてのサービスを完全に停止して再起動しようとしていないようです。
依存関係チェーンを再起動する代わりに、サービスグループの再起動プロパティをsystemdで直接実装できることを示すコンテンツが見つからないようですが、何かが欠落しているか、より良い方法を見落としているようです。
答え1
使用PartOf
すべてのサービスをターゲット単位で完全に開始するように指示することは私の目標を達成するようです。
私のサービスファイルは次のようになります。
[Unit]
Description=foo
After=syslog.target network.target
PartOf=foo.service bar.service baz.service all-services.target
[Service]
User=foo
WorkingDirectory=~
Restart=always
RestartSec=90
StartLimitInterval=400
StartLimitBurst=3
SyslogIdentifier=foo
ExecStart=/path/to/binary
[Install]
WantedBy=all-services.target
グループ化の目標は次のとおりです。
[Unit]
Description=all-services
PartOf=foo.service bar.service baz.service
使用されたプロセスを実行して終了し、foo
サービスをすべて停止して再開することで、サービスを開始して再開できます。bar
baz
systemctl start all-services.target
foo
1つの明確なことは、これを実行するとすべてのsystemctl stop all-services.target
サービスが停止しますが、systemctl start all-services.target
停止した状態ではすべてのサービスではなくターゲットデバイスのみが起動されることです。
WantedBy
サービス単位に変更してみましたが、RequiredBy
何も変わらないようです。
答え2
PartOf
「一度失敗すると、すべてのサービスが再起動されます」という要件に応じて、サービスとターゲットの間の双方向で十分です。
提供する:
[Unit]
PartOf=all-services.target
[Service]
ExecStart=/path/to/binary
Restart=on-failure
ターゲット:
[Unit]
PartOf=foo.service bar.service baz.service
デバイスが失敗して再起動すると、ターゲットはすべてのサービスに再起動をブロードキャストします。
PartOf
サービス間に追加の作業は必要ありません。ターゲットが非アクティブの場合にのみ意味があります。
これ回答BindsTo
あなたの場合はうまくいかない理由を説明してください。
お使いの
foo
デバイスが使用中ですBindsTo=
。これは、可能であればデバイスの状態を追跡することを意味します。消える。
したがって、foo
デバイスは再起動されるまで無効になります。