如何在systemd的监视程序停止服务之前运行特定程序

jot*_*ken 7 watchdog systemd

我有一个程序由systemd运行,其服务文件如下:

[Unit]
Description=...

[Service]
Type=notify
ExecStart=/usr/sbin/myprogram
WatchdogSec=1
KillMode=process
KillSignal=SIGTERM
Restart=always
Run Code Online (Sandbox Code Playgroud)

它会定期向看门狗发送相应的信号.程序似乎不时挂起并由监视程序终止,然后重新启动.在看门狗终止之前,我想通过执行命令或运行其他脚本(例如运行gdb -p <PID> --batch -ex 'thread apply all backtrace')从程序中捕获一些信息.我该怎么做?

iam*_*ser 4

添加ExecStop=到您的服务中。

[Service]
ExecStart=....
ExecStop=/path/to/SomeOtherProgram
....
Run Code Online (Sandbox Code Playgroud)

根据systemd手册,如果ExecStop选项可用,它将首先运行该选项,然后如果ExecStart此后下面的进程仍然可用,它将运行KillMode.

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

编辑

正如下面的评论所示,此解决方案可能不适用于文件Watchdog中的选项service