いずれかのサービスが失敗した場合は、すべてを再開できるようにサービスをグループ化します。

いずれかのサービスが失敗した場合は、すべてを再開できるようにサービスをグループ化します。

あるサービスでエラーが発生した場合は、もう一方のサービスも再起動したいので、基本的に接続されているサービスセットがあります(理想的には単一のサービス/プロセスで実行する必要がありますが、まだ実行する必要があります)。

ターゲットセルを使用して同時にすべて開始し、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サービスをすべて停止して再開することで、サービスを開始して再開できます。barbazsystemctl start all-services.targetfoo

1つの明確なことは、これを実行するとすべてのsystemctl stop all-services.targetサービスが停止しますが、systemctl start all-services.target停止した状態ではすべてのサービスではなくターゲットデバイスのみが起動されることです。

WantedByサービス単位に変更してみましたが、RequiredBy何も変わらないようです。

おすすめ記事