Назад | Перейти на главную страницу

автоматический перезапуск службы systemd после StartLimitInterval

Я хочу, чтобы моя служба systemd автоматически перезапускалась в случае сбоя. Кроме того, я хочу ограничить количество перезапусков. Я хочу разрешить максимум 3 перезапуска в течение 90 секунд. Поэтому я выполнил следующую конфигурацию.

[Обслуживание]
Перезагрузка = всегда
StartLimitInterval = 90
StartLimitBurst = 3

Теперь служба перезапускается в случае сбоя. После 3 быстрых сбоев / перезапусков он больше не перезагружается, как ожидалось. Теперь я ожидал, что systemd запустит службу по истечении времени ожидания (StartLimitInterval). Но systemd не запускает службу автоматически по истечении тайм-аута (90 секунд), если я вручную перезапускаю службу после тайм-аута, она работает. Но я хочу, чтобы systemd автоматически запускал службу после StartLimitInterval. Пожалуйста, дайте мне знать, как добиться этой функции.

Чтобы служба перезапустилась 3 раза с интервалом 90 секунд, включите следующие строки в файл службы systemd:

Restart=always
RestartSec=90
StartLimitInterval=400
StartLimitBurst=3

Это сработало для меня для службы, которая запускает скрипт с использованием Type = idle. Обратите внимание, что StartLimitInterval должно быть больше, чем RestartSec * StartLimitBurst, иначе служба будет перезапущена на неопределенный срок.

Мне потребовалось некоторое время с большим количеством проб и ошибок, чтобы выяснить, как systemd использует эти параметры, что говорит о том, что systemd не так хорошо документирован, как можно было бы надеяться. Эти параметры эффективно обеспечивают время цикла повтора и максимальное количество попыток, которое я искал.

Несколько лет спустя и с systemd 232 он больше не работает, как описано в вопросе и в ответах за 2016 год. Название варианта StartLimitIntervalSec и разделы изменились. Теперь это должно выглядеть так:

[Unit]
StartLimitBurst=5
StartLimitIntervalSec=33

[Service]
Restart=always
RestartSec=5
ExecStart=/bin/sleep 6

Это сделает 5 перезапусков за 30 секунд (5 * 6) плюс один перезапуск за 33 секунды. Итак, у нас есть 6 перезапусков за 33 секунды. Это превышает ограничение в 5 перезапусков за 33 секунды. Таким образом, перезапуски остановятся на 5 отсчетах примерно через 31 секунду.

Описываемое вами поведение соответствует документации:

StartLimitInterval =, StartLimitBurst = Настройте ограничение скорости запуска службы. По умолчанию службы, которые запускаются более 5 раз в течение 10 секунд, не могут запускаться больше раз, пока не закончится 10-секундный интервал. С помощью этих двух опций это ограничение скорости может быть изменено. Используйте StartLimitInterval = для настройки интервала проверки (по умолчанию DefaultStartLimitInterval = в файле конфигурации менеджера, установите значение 0, чтобы отключить любое ограничение скорости). Используйте StartLimitBurst =, чтобы настроить допустимое количество запусков за интервал (по умолчанию DefaultStartLimitBurst = в файле конфигурации менеджера). Эти параметры конфигурации особенно полезны в сочетании с Restart =; однако они применяются ко всем видам запусков (включая ручной), а не только к запускам, запускаемым логикой Restart =. Обратите внимание, что блоки, которые настроены для Restart = и которые достигают предела запуска, больше не пытаются перезапустить; тем не менее, они все равно могут быть перезапущены вручную позже, после чего логика перезапуска снова активируется. Обратите внимание, что systemctl reset-failed приведет к сбросу счетчика скорости перезапуска службы, что полезно, если администратор хочет запустить службу вручную, и лимит запуска мешает этому.

Я все еще пытаюсь найти способ добиться желаемого поведения.

Ты можешь использовать StartLimitAction=reboot. Это перезагрузит систему после StartLimitInterval.

StartLimitAction = Настройте действие, которое будет выполняться при достижении предела скорости, настроенного с помощью StartLimitInterval = и StartLimitBurst =. Принимает одно из следующих значений: нет, перезагрузка, принудительная перезагрузка или немедленная перезагрузка. Если ничего не задано, достижение предела скорости не вызовет никаких действий, кроме того, что запуск будет запрещен. reboot вызывает перезагрузку после обычной процедуры выключения (т.е. эквивалент перезагрузки systemctl). reboot-force вызывает принудительную перезагрузку, которая принудительно завершает все процессы, но не должна вызывать грязных файловых систем при перезагрузке (т.е. эквивалентно systemctl reboot -f), а reboot-explicit вызывает немедленное выполнение системного вызова reboot (2), что может привести к в потере данных. По умолчанию нет.

Вы можете установить OnFailure чтобы запустить другую службу, когда это не удается. в аварийное обслуживание вы можете запустить сценарий, который ждет, а затем перезапускает службу.

Образец того, как это настроить, см. Сообщение о состоянии systemd при сбое устройства и измените его, чтобы вместо этого перезапустить службу.