Existe uma maneira de fazer o systemd desligar o sistema quando um serviço sai com um código específico (por exemplo, código de saída 0)?

Existe uma maneira de fazer o systemd desligar o sistema quando um serviço sai com um código específico (por exemplo, código de saída 0)?

Tenho poucas caixas Linux, cada uma executando um serviço. Este é o único processo importante em execução nessas máquinas. No entanto, às vezes, devido a algumas mudanças de estado internas no serviço, ele irá parar normalmente com o código de saída 0. O que estou procurando é uma maneira idiomática de desligar todo o sistema quando isso acontecer. Basicamente, quero que o systemd interrompa o sistema quando o serviço myservice sair com o código 0 e reinicie o myservice se ele sair com um código de resultado diferente de zero.

Existe uma maneira fácil de fazer isso?

Responder1

/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]
...
...

É simples. Veja outros parâmetros interessantes em man systemd.servicee man systemd.unit.

Responder2

[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

Se o seu serviço for escrito usando Type=oneshot, você precisará do padrão emA resposta de Oxydem vez de. Usar Type=oneshotpara um serviço de longa duração pode não ser muito "idiomático". Quando o programa estiver em execução, o estado de tais serviços será mostrado como "iniciando" e não "em execução".

Nenhum desses padrões é muito elegante, mas é bastante fácil de escrever e acho que devem funcionar bem :-).

informação relacionada