Type= и Restart=: какой выбрать
Type= — как systemd понимает, что служба запустилась
| Значение | Когда «запущена» | Для чего |
|---|---|---|
simple | Сразу после fork, ещё до запуска программы | Программа работает на переднем плане и не уходит в фон — большинство своих приложений |
exec | После успешного запуска исполняемого файла | То же, что simple, но опечатка в пути сразу даёт ошибку start, а не падение потом |
forking | Когда родительский процесс завершился, оставив демона | Старые демоны, которые сами уходят в фон; нужен PIDFile= |
oneshot | Когда команда завершилась | Разовые задачи, скрипты для таймеров; с RemainAfterExit=yes — «включённое состояние» |
notify | Когда программа сама сообщила о готовности (sd_notify) | nginx-подобные демоны, gunicorn, PostgreSQL — systemd ждёт реальной готовности |
idle | Как simple, но после завершения других задач запуска | Редко: чтобы вывод не перемешивался с загрузкой |
Restart= — когда перезапускать
| Значение | Перезапуск, если… |
|---|---|
no | никогда (по умолчанию) |
on-failure | ненулевой код, сигнал, таймаут, watchdog — разумный выбор для веб-приложений |
on-abnormal | сигнал, таймаут или watchdog, но не ненулевой код выхода |
on-abort | только неперехваченный сигнал |
on-watchdog | только истёк WatchdogSec= |
on-success | только при чистом выходе |
always | всегда, даже после нормального завершения — для ботов и воркеров, которые не должны стоять |
Перезапуск не бесконечен: по умолчанию после 5 запусков за 10 секунд служба блокируется. Поэтому вместе с Restart= ставят
RestartSec= в несколько секунд. Как эти параметры работают вместе и где ловушки — подробно про Restart=.
systemctl stop не вызывает перезапуск ни при каком значении: остановка руками — не падение.