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

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

나는 각각 서비스를 실행하는 여러 개의 Linux 시스템을 가지고 있습니다. 이는 이러한 시스템에서 실행되는 유일한 중요한 프로세스입니다. 그러나 때로는 서비스의 일부 내부 상태 변경으로 인해 종료 코드 0으로 정상적으로 중지되는 경우도 있습니다. 내가 찾고 있는 것은 이런 일이 발생했을 때 전체 시스템을 종료하는 관용적인 방법입니다. 기본적으로 myservice가 코드 0으로 종료되면 systemd가 시스템을 중지하고 myservice가 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장기 실행 서비스 의 경우 이는 매우 "관용적"이지 않을 수 있습니다. 프로그램이 실행 중일 때 해당 서비스의 상태는 "실행 중" 대신 "시작 중"으로 표시됩니다.

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

관련 정보