내 애플리케이션에는 두 가지 서비스가 있습니다.
- healthcheck - 시스템 상태를 확인하고 확인이 실패하면 다시 시작을 시도합니다.
- 롤백 - 여러 번의 재시작 시도가 상태 확인에 실패하면 이전 버전으로 롤백됩니다.
상태 확인에 사용되는 단위 파일은 다음과 같습니다.
[Unit]
Description=greenboot Health Checks Runner
Before=boot-complete.target
OnFailureJobMode=fail
[Service]
Type=oneshot
RemainAfterExit=yes
ExecStart=/usr/libexec/greenboot/greenboot health-check
Restart=no
[Install]
RequiredBy=boot-complete.target
WantedBy=multi-user.target
그리고 롤백
[Unit]
Description=Greenboot rollback
DefaultDependencies=no
Before=multi-user.target ostree-finalize-staged.service greenboot.service
Wants=local-fs.target
After=local-fs.target
ConditionNeedsUpdate=|/etc
ConditionNeedsUpdate=|/var
[Service]
Type=oneshot
RemainAfterExit=true
ExecStart=/usr/libexec/greenboot/greenboot rollback
Restart=no
[Install]
WantedBy=multi-user.target
grub 변수를 포함하여 롤백을 위한 추가 트리거 세트와 종료 코드 0으로 롤백이 실행될 때 상태 확인 서비스가 실행되지 않도록 하는 방법이 있습니다.
답변1
상태 확인을 사용하여 OnFailure=
실패 시 롤백을 활성화하고 SuccessAction=reboot
"롤백" 작업이 성공적으로 완료된 후 시스템을 자동으로 다시 시작해 보세요.
IMHO, 두 장치 모두 RemainAfterExit=true
필요하지 않습니다.
(적어도 롤백 측면에서는)
[Install]
다른 섹션은 실패 시에만 활성화될 수 있으므로 상태 확인에만 하나의 섹션이 포함되어야 합니다 .
포스터의 사용 사례에 관계없이 주제 제목에 올바르게 답변하려면 다음을 수행하세요.
ConditionPathExists=!/some/path/filename
파일이 존재하는 경우 실행을 방지하려면 "A" 서비스에서 사용해야 합니다 .ExecStartPost=
그리고 해당 서비스 "B"가 성공적으로 종료될 때 첫 번째 서비스 "A"가 시작되지 않도록 지시문의 다른 서비스 "B"에 해당 파일을 만듭니다 .