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.service
e 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=oneshot
para 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 :-).