¿Hay alguna manera de hacer que systemd apague el sistema cuando un servicio sale con un código particular (por ejemplo, código de salida 0)?

¿Hay alguna manera de hacer que systemd apague el sistema cuando un servicio sale con un código particular (por ejemplo, código de salida 0)?

Tengo algunas cajas de Linux, cada una ejecutando un servicio. Este es el único proceso importante que se ejecuta en estas máquinas. Sin embargo, a veces, debido a algunos cambios de estado internos en el servicio, se detendrá automáticamente con el código de salida 0. Lo que estoy buscando es una forma idiomática de apagar todo el sistema cuando esto suceda. Básicamente, quiero que systemd detenga el sistema cuando el servicio myservice salga con el código 0 y reinicie myservice si sale con un código de resultado distinto de cero.

¿Hay una forma fácil de hacer esto?

Respuesta1

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

Es sencillo. Otros parámetros interesantes se ven en man systemd.servicey man systemd.unit.

Respuesta2

[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

Si su servicio está escrito usando Type=oneshot, necesitará el patrón enLa respuesta de Oxyd.en cambio. Es posible que utilizarlo Type=oneshotpara un servicio de larga duración no sea muy "idiomático". Cuando el programa se esté ejecutando, el estado de dichos servicios se mostrará como "iniciando", no "en ejecución".

Ninguno de estos patrones es muy elegante, pero es bastante fácil de escribir y creo que deberían funcionar bien :-).

información relacionada