Выполнить произвольную команду при сбое службы

11

Я хочу запустить какой-нибудь скрипт при сбое службы. Самое близкое, что я вижу к этому - это FailureAction=опция (в [Service]разделе), но она предлагает только команды перезагрузки.

tshepang
источник

Ответы:

11

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

Разделенный пробелами список из одного или нескольких модулей, которые активируются, когда этот модуль переходит в состояние «сбой».

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

intelfx
источник
Похоже, что эти опции запускают другие юниты, а не только скрипты.
Чепанг
2
@Tshepang: Конечно. В 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) для деталей.

землеройка
источник