서비스가 특정 코드(예: 종료 코드 0)로 종료될 때 시스템을 종료시키는 방법이 있습니까?

서비스가 특정 코드(예: 종료 코드 0)로 종료될 때 시스템을 종료시키는 방법이 있습니까?

각각 서비스를 실행하는 Linux 상자가 거의 없습니다. 이는 이러한 시스템에서 실행되는 유일한 중요한 프로세스입니다. 그러나 때로는 서비스의 일부 내부 상태 변경으로 인해 종료 코드 0과 함께 정상적으로 중지됩니다. 제가 찾고 있는 것은 이런 일이 발생할 때 전체 시스템을 종료하는 관용적인 방법입니다. 기본적으로 myservice 서비스가 코드 0으로 종료되면 systemd가 시스템을 중지하고 0이 아닌 결과 코드로 종료되면 myservice를 다시 시작하기를 원합니다.

이 작업을 수행하는 쉬운 방법이 있나요?

답변1

/etc/systemd/system/my_unit.service:

[Unit]
...
...

[Service]
Type=oneshot
ExecStart=/usr/bin/your_program
ExecStartPost=/usr/bin/systemctl poweroff
RestartSec=5
Restart=on-failure

[Install]
...
...

간단 해. 또 다른 흥미로운 매개변수는 man systemd.service및 를 참조하세요 man systemd.unit.

답변2

[Unit]
...

[Service]
Type=exec  # or any other type you want, apart from "oneshot"
ExecStart=/usr/bin/your_program
ExecStopPost=/bin/sh -c \
        'if [ "$SERVICE_RESULT" = "success" ]; then systemctl poweroff; fi'
RestartSec=5
Restart=on-failure

를 사용하여 서비스를 작성한 경우 Type=oneshot다음 패턴이 필요합니다.옥시드의 답변대신에. Type=oneshot장기 실행 서비스에 사용하는 것은 그다지 "관용적"이지 않을 수 있습니다. 프로그램이 실행 중일 때 해당 서비스의 상태는 "실행 중"이 아닌 "시작 중"으로 표시됩니다.

이러한 패턴 중 어느 것도 매우 우아하지는 않지만 작성하기가 매우 쉽고 괜찮을 것이라고 생각합니다 :-).

관련 정보