Виконайте довільну команду, коли служба не працює


12

Я хочу запустити якийсь сценарій, коли сервіс не працює. Найближчим, що я бачу в цьому, є FailureAction=варіант (під [Service]розділом), але він пропонує лише команди перезавантаження.

Відповіді:


11

У розділі є OnFailure=директива [Unit], задокументована в systemd.unit (5) . Він визначається наступним чином:

Список розділених пробілом одного або декількох одиниць, які активуються, коли цей пристрій переходить у стан "невдало".

(Також OnFailureJobMode=в тому ж розділі є директива, яка дозволяє встановити режим роботи для активації OnFailure = одиниць.)


Схоже, ці параметри запускають інші блоки, а не просто сценарії.
thepang

2
@Theheng: Звичайно. У systemd, одиниця - це, звичайно, основна одиниця робити що-небудь. Напишіть просту одиницю для свого сценарію, поставте його під /etc/systemd/systemі вкажіть його ім’я в OnFailure=директиві.
intelfx

2

Ви також можете використовувати ExecStopPostкоманду безпосередньо для запуску команди замість запуску одиниці.

Я не був задоволений OnFailureобстановкою, тому продовжував шукати і знаходити ExecStopPost.

Наступний реальний приклад, якщо основне завдання не вдається, тоді systemd виконає gitкоманду.

[Unit]
Description=SRI Dispenser Server
ConditionPathExists=|/usr/bin/
After=sri-boot-dsp.service

[Service]
WorkingDirectory=/usr/share/sri/configurations/transmitter

User=root

# This is task to run when this service starts
ExecStart=/usr/bin/python -m sri.DispenserServer

# If any of the ExecStart tasks fail, then ExecStopPost will run
ExecStopPost=/bin/git checkout -- .

Restart=always
RestartSec=10
KillSignal=SIGKILL


[Install]
WantedBy=multi-user.target

https://www.freedesktop.org/software/systemd/man/systemd.service.html

ExecStopPost = Додаткові команди, які виконуються після зупинки послуги. Сюди входять випадки, коли використовувались команди, налаштовані в ExecStop =, де для служби не визначено ExecStop = або служба несподівано завершилась. Цей аргумент займає кілька командних рядків, дотримуючись тієї ж схеми, що описана для ExecStart =. Використання цих налаштувань необов’язково. Підтримка змінних специфікаторів та середовища підтримується. Зауважте, що - на відміну від ExecStop = - команди, визначені за допомогою цього налаштування, викликаються, коли служба не запустилася належним чином та знову закрилася.

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

Зауважте, що всі команди, налаштовані за допомогою цього параметра, викликаються кодом результату послуги, а також кодом виходу та статусом основного процесу, встановленим у змінних середовища $ $ SERVICE_RESULT, $ EXIT_CODE та $ EXIT_STATUS, див. Systemd.exec (5) для деталей.

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