Допишите systemd-unit сервиса, который перезапускает демон при сбое.
Допишите systemd-unit сервиса для долго живущего демона.
Ограничения: он должен автоматически перезапускаться при сбое с небольшой задержкой и стартовать при загрузке после включения. Впишите недостающие директивы — не меняйте ExecStart.
[Unit]
Description=My App
After=network.target
[Service]
ExecStart=/usr/bin/myapp
# 1) автоматически перезапускать демон при выходе с ошибкой
# 2) выждать несколько секунд между перезапусками
[Install]
# 3) какой target должен подхватить unit при загрузке?
Добавьте директивы перезапуска и install-target, затем скажите, как его активировать.
В [Service] добавьте Restart=on-failure, чтобы systemd перезапускал демон при сбое, плюс RestartSec=5. В [Install] добавьте WantedBy=multi-user.target, чтобы enable связал unit с этим target загрузки. Затем выполните systemctl enable --now myapp: enable включает автозапуск, --now запускает сейчас.
- ✗Класть
RestartилиWantedByне в ту секцию unit - ✗Думать, что одного
systemctl startхватает, чтобы unit пережил перезагрузку - ✗Опустить
[Install] WantedBy, и тогдаenableнекуда связать unit
- →Что делает
systemctl daemon-reloadпосле правки файла unit? - →Чем
Restart=on-failureотличается отRestart=always?
Решение
[Unit]
Description=My App
After=network.target
[Service]
ExecStart=/usr/bin/myapp
Restart=on-failure
RestartSec=5
[Install]
WantedBy=multi-user.target
ненулевым кодом (падение); RestartSec=5 разносит повторы, чтобы не молотить в цикле. Для «перезапускать всегда, даже при чистом выходе» берут Restart=always.
симлинк из multi-user.target.wants/, и unit подхватывается на этом target загрузки (аналог runlevel 3). Без секции [Install] enable не к чему привязать unit.
Restart=on-failureзаставляет systemd перезапускать демон, когда тот выходит сWantedBy=multi-user.targetв[Install]— это то, что делаетenable: он создаёт- Активация в два шага одной командой:
systemctl daemon-reload # перечитать файл после правки
systemctl enable --now myapp # enable = автозапуск при загрузке, --now = запустить сейчас
enable создаёт симлинк для будущих загрузок, но не запускает сервис сейчас; start запускает сейчас, но не переживает перезагрузку. --now делает оба.