Сервис хорош, если соответствует всем пунктам чеклиста.
Список будет расширяться, много сервисов будет им не соответствовать.
Сервис:
- восстанавливает работоспособность при перезапуске брокера:
- не зависает;
- не падает;
- подписывается на все свои топики;
- публикует заново retain-сообщения с метаданными;
- падает при ошибке аутентификации без перезапуска в systemd;
- одинаково отключается сигналами
SIGTERM
иSIGINT
; - аккуратно завершается при отключении:
- гарантированно публикует пустые retain-сообщения на месте метаданных;
- отправляет disconnect (смотреть в логах mosquitto);
- аккуратно завершается, если, согласно конфигу, от сервиса ничего не требуется:
- пример: в serial выключены все порты, в mbgate выключены все топики и т.п.
Сервис в зависимости от типа возникающих ошибок возвращает код:
EXIT_SUCCESS=0
(входит вstdlib.h
) - успешное завершение (не имеет смысла в контексте долгоживущего сервиса, подходит для oneshot). Для обычных сервисов см.EXIT_NOTRUNNING=7
EXIT_FAILURE=1
(входит вstdlib.h
) - общая ошибка при неудачном завершении работы сервиса, есть смысл перезапустить сервисEXIT_INVALIDARGUMENT=2
(входит в спецификацию LSB) - неверные или лишние аргументы командной строки, автоматически перезапускать сервис бессмысленноEXIT_NOTCONFIGURED=6
(входит в спецификацию LSB) - неверная конфигурация (когда конфиг плохо распарсился или в нём есть логические ошибки), автоматически перезапускать сервис бессмысленноEXIT_NOTRUNNING=7
(входит в спецификацию LSB) - согласно конфигурации, сервису не надо ничего делать, потому он выключился и не потребляет ресурсов, при этом он не failed
Дополнительные коды можно взять из спецификации: https://freedesktop.org/software/systemd/man/systemd.exec.html#Process%20Exit%20Codes
При неудачном завершении сервиса со статусом EXIT_FAILURE=1
должна производится попытка повторного запуска. За это отвечает параметр в файле настройки systemd модуля:
[Service]
...
Restart=on-failure
RestartSec=<Время ожидания перед перезапуском службы, сек>
...
Для предотвращения повторного запуска сервиса, если возникла неустранимая ошибка в конфигурационных файлах сервиса, либо ошибках отличных от EXIT_FAILURE
, то добавляется параметр в файл настройки systemd модуля в секцию Service
:
[Service]
...
RestartPreventExitStatus=2 3 4 5 6
...
Чтобы статус EXIT_NOTRUNNING=7
не считался ошибкой, необходимо добавить параметр в файл настройки systemd модуля в секцию Service
:
[Service]
...
SuccessExitStatus=7
...