Я хочу, чтобы моя служба systemd автоматически перезапускалась при сбое. Дополнительно я хочу оценить ограничение перезапусков. Я хочу разрешить максимум 3 перезапуска в течение 90 секунд. Поэтому я сделал следующую конфигурацию.
[Сервис]
Restart = всегда
StartLimitInterval = 90
StartLimitBurst = 3
Теперь служба перезапускается при сбое. После 3 быстрых сбоев / перезапусков он перезапускается не так, как ожидалось. Теперь я ожидал, что systemd запустит службу после истечения времени ожидания (StartLimitInterval). Но systemd не запускает службу автоматически после истечения времени ожидания (90 секунд), если я вручную перезапускаю службу после истечения времени ожидания. Но я хочу, чтобы systemd автоматически запускал службу после StartLimitInterval. Пожалуйста, дайте мне знать, как добиться этой функции.
StartLimitIntervalSec
, а неStartLimitInterval
.Ответы:
Чтобы сервис перезапускался 3 раза с интервалом 90 секунд, включите в файл службы systemd следующие строки:
Это сработало у меня для службы, которая запускает скрипт, используя 'Type = idle'. Обратите внимание, что StartLimitInterval должен быть больше чем RestartSec * StartLimitBurst, в противном случае служба будет перезапущена на неопределенный срок.
Мне потребовалось некоторое время с большим количеством проб и ошибок, чтобы понять, как systemd использует эти опции, что говорит о том, что systemd не так хорошо документирован, как можно было бы надеяться. Эти параметры эффективно обеспечивают время цикла повторных попыток и максимальное количество повторных попыток, которые я искал.
источник
StartLimitInterval=
директиву в моем последнем Ubuntu 18 ...Поведение, которое вы описываете, согласуется с документацией:
StartLimitInterval =, StartLimitBurst = Настройка ограничения скорости запуска службы. По умолчанию сервисам, которые запускаются более 5 раз в течение 10 секунд, не разрешается запускаться больше, пока не закончится 10-секундный интервал. С этими двумя вариантами это ограничение скорости может быть изменено. Используйте StartLimitInterval = для настройки интервала проверки (по умолчанию DefaultStartLimitInterval = в файле конфигурации менеджера, установите 0, чтобы отключить любое ограничение скорости). Используйте StartLimitBurst =, чтобы настроить количество пусков за интервал (по умолчанию DefaultStartLimitBurst = в файле конфигурации менеджера). Эти параметры конфигурации особенно полезны в сочетании с Restart =; однако они применяются ко всем видам пусков (включая ручные), а не только к тем, которые запускаются логикой Restart =.Обратите внимание, что блоки, которые настроены на Restart = и достигают предела запуска, больше не пытаются перезапускаться; тем не менее, они могут быть перезапущены вручную позднее, после чего логика перезапуска снова активируется. Обратите внимание, что systemctl reset-failed приведет к сбросу счетчика скорости перезапуска для службы, что полезно, если администратор хочет вручную запустить службу, а ограничение запуска мешает этому.
Я все еще пытаюсь найти способ достичь желаемого поведения.
источник
StartLimitIntervalSec=
(иDefaultStartLimitIntervalSec=
)? Обратите внимание на добавлениеSec
к обоим именам параметров.Несколько лет спустя и с systemd 232 он больше не работает, как описано в вопросе и в ответах от 2016 года. Название опции
StartLimitIntervalSec
и разделы изменились. Теперь это должно выглядеть так:Это сделает 5 перезапусков за 30 секунд (5 * 6) плюс один перезапуск за 33 секунды. Таким образом, у нас есть 6 перезапусков за 33 секунды. Это превышает предел 5 перезапусков в 33 сек. Таким образом, перезапуски останавливаются на 5 отсчете примерно через 31 сек.
источник
StartLimitInterval
все еще поддерживается, если не документировано, вService
разделе. Но новый, предпочтительныйStartLimitIntervalSec
работает только вUnit
.Вы можете настроить
OnFailure
запуск другой службы, когда это не удается. В сервисе по ошибке вы можете запустить скрипт, который ждет и затем перезапускает сервис.Пример того, как это настроить, см. В сообщении о состоянии Systemd при сбое устройства и измените его, чтобы вместо этого перезапустить службу.
источник
Вы можете использовать
StartLimitAction=reboot
. Это перезагрузит систему после StartLimitInterval.источник