Поднимать ли службу после сбоя, systemd читает в её описании. В этом шаге — где лежит описание и какие строки в нём главные.
Как запускать службу, systemd узнаёт из файла юнита. Путь к нему стоит в строке Loaded сводки systemctl status, а целиком файл печатает systemctl cat. Вот что systemctl cat cron печатает на учебной машине:
Этот файл поставил пакет cron: dpkg -S /usr/lib/systemd/system/cron.service из модуля о пакетах печатает cron: /usr/lib/systemd/system/cron.service.
Файл делится на секции в квадратных скобках, в каждой — строки ключ=значение. Две строки секции [Service] объясняют то, что ты увидел:
- ExecStart — какую программу запускать. У cron это
/usr/sbin/cron -f -P. - Restart — запускать ли службу заново, когда её процесс завершился.
on-failureзначит «после сбоя»: процесс вышел с ненулевым кодом, убит сигналом или не уложился во время.
Строки с # в начале — комментарии, systemd их пропускает. Файл nginx длинный, поэтому его печатают с --no-pager — иначе systemctl cat откроет его в пейджере:
Строки Restart в файле nginx нет. Тогда действует значение по умолчанию, no: после сбоя systemd службу заново не запускает, и она остаётся failed.
В юните службы Restart=on-failure. Её программа закончила работу и вышла с кодом 0. Что сделает systemd?
-
on-failureсрабатывает после сбоя: ненулевого кода, сигнала или превышения времени. Код 0 значит, что программа закончила штатно. -
Код 0 — не сбой: отмечать службу как
failedне за что, иon-failureне срабатывает. -
Restartс автозапуском не связан:systemctl is-enabledпечатает то же, что и до завершения программы.
on-failure перезапускает службу после сбоя — ненулевого кода завершения, сигнала или превышения времени. Программа, вышедшая с кодом 0, закончила работу штатно, и служба остаётся inactive.
Главное в шаге
-
Описание службы — файл юнита: путь к нему стоит в строке
Loaded, целиком файл печатаетsystemctl cat. -
ExecStart— программа службы,Restart— запускать ли её заново; безRestartупавшая служба остаётсяfailed.