한 서비스에 오류가 발생하면 다른 서비스도 다시 시작되기를 원하기 때문에 기본적으로 연결된 서비스 세트가 있습니다(이상적으로는 단일 서비스/프로세스로 실행해야 하지만 여전히 수행해야 함).
대상 셀을 사용하여 동시에 모두 시작하고 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
서비스를 모두 중지하고 다시 시작함으로써 서비스를 시작하고 다시 시작할 수 있습니다.bar
baz
systemctl start all-services.target
foo
한 가지 명확하지 않은 점은 이를 실행하면 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
장치는 다시 시작될 때까지 비활성화됩니다.