다른 서비스가 성공적으로 실행 중일 때 systemd 서비스를 실행하지 마십시오

다른 서비스가 성공적으로 실행 중일 때 systemd 서비스를 실행하지 마십시오

내 애플리케이션에는 두 가지 서비스가 있습니다.

  1. healthcheck - 시스템 상태를 확인하고 확인이 실패하면 다시 시작을 시도합니다.
  2. 롤백 - 여러 번의 재시작 시도가 상태 확인에 실패하면 이전 버전으로 롤백됩니다.

상태 확인에 사용되는 단위 파일은 다음과 같습니다.

[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]다른 섹션은 실패 시에만 활성화될 수 있으므로 상태 확인에만 하나의 섹션이 포함되어야 합니다 .


포스터의 사용 사례에 관계없이 주제 제목에 올바르게 답변하려면 다음을 수행하세요.

  1. ConditionPathExists=!/some/path/filename파일이 존재하는 경우 실행을 방지하려면 "A" 서비스에서 사용해야 합니다 .
  2. ExecStartPost=그리고 해당 서비스 "B"가 성공적으로 종료될 때 첫 번째 서비스 "A"가 시작되지 않도록 지시문의 다른 서비스 "B"에 해당 파일을 만듭니다 .

관련 정보