如何在Systemd的看门狗停止服务之前运行特定程序

时间:2018-10-17 17:04:38

标签: systemd watchdog

我有一个由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 :(得分:4)

向您的服务添加ExecStop=

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

根据systemd手册,如果ExecStop选项可用,它将首先运行该选项,然后,如果ExecStart下的进程仍然可用,它将运行{{ 1}}。

  

ExecStop =     执行命令以停止通过服务启动的服务   ExecStart =。该参数采用多个命令行,紧跟在   与上面的ExecStart =描述的方案相同。使用此设置是   可选的。运行此选项中配置的命令后,它是   表示服务已停止,并且剩余的任何进程   它根据KillMode =设置终止(请参阅   systemd.kill(5))。如果未指定此选项,则过程为   通过在服务时发送KillSignal =中指定的信号来终止   请求停止。指定符和环境变量替换为   支持(包括$ MAINPID,请参见上文)。

编辑

如下面的注释所示,此解决方案可能不适用于KillMode文件中的Watchdog选项。