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

33

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

[Сервис]
Restart = всегда
StartLimitInterval = 90
StartLimitBurst = 3

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

Динеш ПР
источник
3
Я написал статью, в которой объясняется, как создать службу и как избежать этой конкретной проблемы: создание службы Linux с помощью systemd .
Бенджамин
2
Я думаю, что вы ищете StartLimitIntervalSec, а не StartLimitInterval.
Марк

Ответы:

30

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

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

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

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

jross
источник
Это должно быть помечено как принятый ответ ...
Джефф
не могу найти StartLimitInterval=директиву в моем последнем Ubuntu 18 ...
фитиль
10

Поведение, которое вы описываете, согласуется с документацией:

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

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

Юсеф Эльдакар
источник
Как вы указываете, это больше комментарий, чем ответ.
Дейв М
именно то, что мне нужно, ты
Немного Linux Nerd
В соответствии с документацией, на которую вы ссылались, разве это не должно быть StartLimitIntervalSec=DefaultStartLimitIntervalSec=)? Обратите внимание на добавление Secк обоим именам параметров.
Доктор Джей
6

Несколько лет спустя и с 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 сек.

Инго
источник
1
Похоже, StartLimitIntervalвсе еще поддерживается, если не документировано, в Serviceразделе. Но новый, предпочтительный StartLimitIntervalSecработает только в Unit.
Данек Дюваль
1

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

Пример того, как это настроить, см. В сообщении о состоянии Systemd при сбое устройства и измените его, чтобы вместо этого перезапустить службу.

laktak
источник
1

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

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

MCV
источник