Как запустить определенную программу до того, как сторожевой таймер systemd остановит службу - PullRequest
0 голосов
/ 17 октября 2018

У меня есть программа, которая запускается системой systemd с таким служебным файлом:

[Unit]
Description=...

[Service]
Type=notify
ExecStart=/usr/sbin/myprogram
WatchdogSec=1
KillMode=process
KillSignal=SIGTERM
Restart=always

Она регулярно отправляет соответствующий сигнал в сторожевой таймер.Время от времени программа, кажется, зависает и останавливается сторожевым таймером, а затем перезапускается.Прежде чем сторожевой таймер завершит его, я бы хотел получить некоторую информацию из программы, выполнив команду или запустив какой-либо другой скрипт (например, запустите gdb -p <PID> --batch -ex 'thread apply all backtrace').Как бы я это сделал?

1 Ответ

0 голосов
/ 17 октября 2018

Добавьте ExecStop= к вашему сервису.

[Service]
ExecStart=....
ExecStop=/path/to/SomeOtherProgram
....

В соответствии с руководством systemd, если доступна опция ExecStop, она сначала будет запущена, а затем, если процесс под ExecStartпо-прежнему доступен после этого, он будет запускать KillMode.

ExecStop = Команды для выполнения, чтобы остановить службу, запущенную через ExecStart =.Этот аргумент принимает несколько командных строк, следуя той же схеме, что описана для ExecStart = выше.Использование этого параметра не является обязательным.После запуска команд, настроенных в этом параметре, подразумевается, что служба остановлена, и все процессы, оставшиеся для нее, завершаются в соответствии с настройкой KillMode = (см. Systemd.kill (5)).Если эта опция не указана, процесс завершается отправкой сигнала, указанного в KillSignal =, когда запрашивается останов службы.Поддерживается подстановка спецификатора и переменной среды (включая $ MAINPID, см. Выше).

EDIT

Как и в комментарии ниже, это решение может не работать для опции Watchdog вservice файл.

...