автоматичний перезапуск сервісної системи після StartLimitInterval


33

Я хочу, щоб мій системний сервіс був автоматично запущений при відмові. Додатково хочу обмежити перезавантаження. Я хочу дозволити максимум 3 перезавантаження протягом 90 секунд. Отже, я зробив таку конфігурацію.

[Сервіс]
Перезапуск = завжди
StartLimitInterval = 90
StartLimitBurst = 3

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


3
Я написав статтю, в якій пояснюється, як створити службу та як уникнути цієї конкретної проблеми: Створення служби Linux із системою systemd .
Бенджамін

2
Я думаю, ти шукаєш StartLimitIntervalSec, ні StartLimitInterval.
Марк Тамський

Відповіді:


30

Щоб перезапустити сервіс 3 рази з інтервалом 90 секунд, включіть наступні рядки у файл системного сервісу:

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

Це працювало для мене для служби, яка запускає скрипт, використовуючи 'Type = idle'. Зверніть увагу, що "StartLimitInterval" повинен бути більшим, ніж "RestartSec * StartLimitBurst", інакше послуга буде перезапущена на невизначений термін.

Щоб проаналізувати, як systemd використовує ці параметри, мені знадобилося певний час, як багато спроб і помилок, що дозволяє припустити, що systemd не так добре задокументований, як можна було б сподіватися. Ці параметри ефективно забезпечують час циклу повторних спроб та максимум спроб, які я шукав.


Це слід позначити як прийняту відповідь ...
Джефф

не можу знайти StartLimitInterval=директиву в моєму останньому ubuntu 18 ...
wick

10

Поведінка, яку ви описуєте, відповідає документації:

StartLimitInterval =, StartLimitBurst = Налаштування обмеження швидкості запуску послуги. За замовчуванням послуги, які запускаються більше 5 разів протягом 10 секунд, забороняється запускати більше разів, поки не закінчиться інтервал 10 секунд. За допомогою цих двох варіантів це обмеження швидкості може бути змінено. Використовуйте StartLimitInterval = для налаштування інтервалу перевірки (за замовчуванням параметр DefaultStartLimitInterval = у файлі конфігурації менеджера, встановлений на 0 для відключення будь-якого виду обмеження швидкості). Використовуйте StartLimitBurst =, щоб налаштувати, скільки запусків за інтервал дозволено (за замовчуванням у DefaultStartLimitBurst = у файлі конфігурації менеджера). Ці параметри конфігурації особливо корисні в поєднанні з Restart =; однак вони стосуються всіх видів запуску (включаючи ручні), а не лише тих, що викликаються перезапуском = логікою.Зауважте, що одиниці, налаштовані для Restart = і які досягають ліміту початку, більше не намагаються перезапустити; однак, вони можуть бути перезапущені вручну в більш пізній момент, після чого логіка перезапуску знову активується. Зверніть увагу, що systemctl не вдалося скинути змушує лічильник швидкості перезапуску для служби, що може бути розмитим, що корисно, якщо адміністратор хоче вручну запустити службу, а обмеження запуску заважає цьому.

Я все ще намагаюся самостійно знайти спосіб досягти бажаної вам поведінки.


Це, скоріше, коментар, ніж відповідь.
Дейв М

саме те, що мені потрібно, ty
Деякі Linux Nerd

Відповідно до документації, яку ви зв'язали, чи не має бути StartLimitIntervalSec=DefaultStartLimitIntervalSec=)? Зверніть увагу на додавання Secобох назв параметрів.
Doktor J

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запустити іншу послугу, коли ця помилка не працює. У службі відмови ви можете запустити сценарій, який чекає, а потім перезапустити службу.

Для прикладу того, як це налаштувати, див. Пошту про стан системи у випадку відмови пристрою та змініть її, щоб замість цього перезапустити службу.


1

Можна використовувати StartLimitAction=reboot . Це перезавантажить систему після StartLimitInterval.

StartLimitAction = Налаштуйте дію, яку слід здійснити, якщо буде досягнуто обмеження швидкості, налаштоване з StartLimitInterval = і StartLimitBurst =. Бере одну з жодних, перезавантажуйте, перезавантажуйте силу або перезавантажуйте безпосередньо. Якщо нічого не встановлено, натискання межі швидкості не спричинить жодної дії, окрім того, що старт заборонений. перезавантаження викликає перезавантаження після звичайної процедури відключення (тобто еквівалентно перезавантаження systemctl). Сила перезавантаження викликає вимушене перезавантаження, яке примусово припинить всі процеси, але не повинно викликати брудної файлової системи при перезавантаженні (тобто еквівалентно systemctl перезавантаження -f), а перезавантаження негайне викликає негайне виконання системного виклику перезавантаження (2), що може призвести до у втраті даних. По замовчуванню немає.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.