Есть ли способ заставить systemd завершить работу системы при завершении службы с определенным кодом (например, кодом завершения 0)?

Есть ли способ заставить systemd завершить работу системы при завершении службы с определенным кодом (например, кодом завершения 0)?

У меня есть несколько Linux-боксов, на каждом из которых запущена служба. Это единственный важный процесс, запущенный на этих машинах. Однако иногда из-за некоторых внутренних изменений состояния в службе она изящно останавливается с кодом выхода 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для долго работающей службы может быть не очень "идиоматичным". Когда программа запущена, состояние таких служб будет отображаться как "запуск", а не "выполнение".

Ни один из этих шаблонов не является элегантным, но их довольно легко написать, и я думаю, что они должны работать нормально :-).

Связанный контент