systemd: 실패 시 시작 프로세스 중지(실제로 종료)

systemd: 실패 시 시작 프로세스 중지(실제로 종료)

일회성 서비스가 실패하는 경우 시작 프로세스를 즉시 중지하고 메시지를 표시(시작 화면 종료)한 후 컴퓨터를 종료하려면 어떻게 해야 합니까?

내 서비스는 스크립트만 시작합니다. 뭔가 잘못되거나 더 정확하게 말하면 특별한 일이 발생하면 기계를 종료하고 싶습니다. 지금까지 스크립트에 하나를 넣으려고 했습니다 systemctl poweroff. 그러나 불행하게도 이 호출은 즉시 반환되고 시작 프로세스는 종료와 거의 동시에 정상적으로 계속됩니다. 제 경우에는 종료가 최종적으로 완료될 때까지 몇 초간 로그인 화면이 나타납니다.

이것은 내 유닛 파일입니다:

[Unit]
Description=My Fancy Script
Before=NetworkManager.target

[Service]
Type=oneshot
ExecStart=/path/to/script
StandardOutput=journal+console

[Install]
WantedBy=basic.target

사용해 보기도 했지만 FailureAction=그것도 효과가 없었습니다.

이 작업을 수행하는 방법에 대한 아이디어가 있습니까? "전형적인" 방법이 있어야 합니다. 예를 들어, 마운트 지점을 마운트할 수 없는 경우 시스템은 유지 관리 모드(ctrl-D;)로 들어가고 부팅이 중단됩니다.

답변1

"전형적인" 방법이 있어야 합니다. 예를 들어, 마운트 지점을 로드할 수 없는 경우 시스템은 유지 관리 모드로 전환되고 부팅이 중단됩니다.

바로 여기에. 보시면 /usr/lib/systemd/system/local-fs.target아시겠지만 그렇죠

OnFailure=emergency.target
OnFailureJobMode=교체-되돌릴 수 없음

답변2

몇 가지 옵션이 있습니다. 하나는 손상될 수 없는 상태 비저장 시스템에 적합할 수 있는 잔인한 옵션입니다. --force옵션을 추가하는 것입니다poweroff

poweroff --force

문서에는 "즉시 중지하고 전원을 끄고 재부팅하십시오. 초기화 시스템에 연락하지 마십시오."라고 나와 있습니다.

다른 서비스는 계속해서 병렬로 시작되지만 중단 속도는 더 빨라집니다.


여러분이 보고 있는 동작은 systemd가 가능한 한 많은 작업을 병렬로 실행하여 시스템을 최대한 빨리 부팅하려고 하기 때문입니다. 이는 종속성이 충족되자마자 서비스 실행이 완료될 필요가 없이 다음 작업으로 이동한다는 것을 의미합니다.

로그인 화면 및 기타 서비스는 실행할 서비스에 의존하지 않으므로 종료 시퀀스가 ​​실행되기 시작한 경우에도 병렬로 시작됩니다.

계속하기 전에 시작 프로세스를 일시 중지하고 작업이 완료될 때까지 기다리면 문제를 해결할 수 있습니다. 먼저, 사용자 정의 서비스가 완료되기 전에 어떤 서비스를 시작해야 하는지 결정한 다음 new를 사용하여 해당 서비스나 대상을 파일에 추가하세요.이전=기입.

관련 정보