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