Если я сделаю это в сценарии, при вызове статуса будет отображаться "ОК".
Но всего через несколько миллисекунд статус «сбой».
Как я могу определить, был ли запуск успешным?
Что для меня здесь означает «успешно»: сервер заработал.
Systemd запускает процесс и не ждет, чтобы убедиться, что сервер запустился правильно.
Пример: Конфигурация сервера содержит синтаксическую ошибку. Сервер будет работать несколько миллисекунд, но затем прекратит работу.
Самым простым решением было бы выполнить «sleep 1» перед моим вызовом «systemctl status foo».
Но это кажется грязным.
Возможно, есть лучшее решение для получения реального статуса после запуска сервера.
Меня волнует только начало. Если через два часа сервер выйдет из строя, это не входит в этот вопрос.
Обычно вы получаете failed
состояние в этом выводе команды для запущенного процесса, когда:
status
что не равно 0
или со статусом, отличным от SuccessExitStatus
параметр, указанный в файле модуля [Service]
разделTimeoutStartSec
или TimeoutSec
, по умолчанию - значение DefaultTimeoutStartSec
, который обычно составляет 90 секунд или установлен в system.conf
, [Manager]
разделtype=notify
), как и выше, управляется WatchdogSec
, RuntimeWatchdogSec
Служба должна регулярно вызывать sd_notify (3) с «WATCHDOG = 1» (т. Е. «Keep-alive ping»). Если время между двумя такими вызовами больше, чем настроенное время, служба переводится в состояние сбоя.
type
неправильно установлен в файле модуля
GuessMainPID
Принимает логическое значение, указывающее, следует ли systemd попытаться угадать основной PID службы, если он не может быть надежно определен. Этот параметр игнорируется, если не установлен Type = forking. и PIDFile = не установлен, потому что для других типов или с явно настроенным файлом PID всегда известен основной PID. Алгоритм угадывания может прийти к неверным выводам, если демон состоит из более чем одного процесса. Если основной PID не может быть определен, обнаружение сбоев и автоматический перезапуск службы не будут работать надежно.. По умолчанию да.