systemd
여기 에 대한 문서를 검토했습니다.https://www.freedesktop.org/software/systemd/man/systemd.service.html.
ExecStartPre=,ExecStartPost=
섹션 에 명시되어 있습니다.
ExecStartPre=, ExecStart= 또는 ExecStartPost=에 지정된 명령이 실패하거나("-" 접두사가 붙지 않음, 위 참조) 서비스가 완전히 작동되기 전에 시간이 초과되면 ExecStopPost=에 지정된 명령으로 실행이 계속됩니다. , ExecStop=의 명령을 건너뜁니다.
나에겐 ExecStartPre
규칙이 있다
ExecStartPre=/bin/false
나는 .ExecStopPost
/bin/echo "I'm at ExecStopPost"
서비스는 다음과 같습니다
[Unit]
Description=Test
[Service]
Type=oneshot
ExecStartPre=/bin/echo "I'm at ExecStartPre"
ExecStartPre=/bin/false
ExecStart=/bin/echo "Running Test"
ExecStopPost=/bin/echo "I'm at ExecStopPost"
실행되고 실패하면 나는 그것을 볼 수 없습니다. syslog의 출력은 다음과 같습니다.
6월 15일 20:48:01 ip-10-0-0-246 echo[8687]: 저는 ExecStartPre에 있습니다
6월 15일 20:48:01 ip-10-0-0-246 systemd[1]: test.service: 제어 프로세스가 종료됨, 코드=종료 상태=1
6월 15일 20:48:01 ip-10-0-0-246 systemd[1]: 테스트를 시작하지 못했습니다.
6월 15일 20:48:01 ip-10-0-0-246 systemd[1]: test.service.service: 장치가 실패 상태로 전환되었습니다.
6월 15일 20:48:01 ip-10-0-0-246 systemd[1]: test.service.service: 'exit-code' 결과로 실패했습니다.
나는 내 에코를 결코 보지 못합니다.
journalctl -u test.service
물론 이것도 항목으로 있습니다.
이것을 약간 다르게 구성해야 합니까? 아니면 을 사용해야 합니까 OnFailure
?
Conflicts=
성공 또는 실패 사례를 다시 시작할 수 있어야 합니다 . 이는 타이머에 의해 트리거되는 원샷 서비스에 사용됩니다.
아, 그리고 이것은 16.04.6 LTS에서 실행됩니다.
답변1
서비스는 실패 시 oneshot
호출하지 않는 것으로 보입니다 . ExecStopPost
이 링크에서 이에 대해 논의합니다.https://bugzilla.redhat.com/show_bug.cgi?id=1353039.
관련 게시물은
ExecStopPost는 장치가 실행 상태에서 전환되는 경우(장치가 종료된 경우에도) 또는 활성화 상태에 있는 동안 Main PID가 성공적으로 종료되고 서비스가 분기 유형이 아닌 경우에만 실행됩니다.
차이점은 구성된 ExecStart 작업이 실행되는 동안 원샷 서비스의 경우 서비스는 여전히 활성화 상태에 있고 실행되지 않는다는 것입니다. 그러나 단순 서비스의 경우 systemd는 서비스를 즉시 실행 상태로 전환하고 systemctl은 차단하지 않으며 ExecStart가 실패하더라도(예: ExecStart=/bin/false) 종료 0이 반환됩니다. 따라서 ExecStopPost가 호출되려면 원샷 서비스가 완전히 종료되어야 합니다. AFAICT, RemainAfterExit 옵션은 ExecStopPost에 영향을 미치지 않습니다.
솔루션은 OnFailure
호출되었을 필수 항목을 호출하기 위해 를 추가하는 것으로 끝났습니다.ExecStopPost