서비스 중 하나가 실패하면 모두 다시 시작할 수 있도록 서비스를 그룹화합니다.

서비스 중 하나가 실패하면 모두 다시 시작할 수 있도록 서비스를 그룹화합니다.

한 서비스에 오류가 발생하면 다른 서비스도 다시 시작되기를 원하기 때문에 기본적으로 연결된 서비스 세트가 있습니다(이상적으로는 단일 서비스/프로세스로 실행해야 하지만 여전히 수행해야 함).

대상 셀을 사용하여 동시에 모두 시작하고 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지시문은 서비스 하나가 실패할 경우 모든 서비스를 완전히 중지하고 다시 시작을 시도하지 않는 것으로 보입니다.

종속성 체인을 다시 시작하는 대신 서비스 그룹 다시 시작 속성을 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

한 가지 명확하지 않은 점은 이를 실행하면 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장치는 다시 시작될 때까지 비활성화됩니다.

관련 정보