我有一个由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'
)从程序中捕获一些信息。我该怎么办?
答案 0 :(得分:4)
向您的服务添加ExecStop=
。
[Service]
ExecStart=....
ExecStop=/path/to/SomeOtherProgram
....
根据systemd
手册,如果ExecStop
选项可用,它将首先运行该选项,然后,如果ExecStart
下的进程仍然可用,它将运行{{ 1}}。
ExecStop = 执行命令以停止通过服务启动的服务 ExecStart =。该参数采用多个命令行,紧跟在 与上面的ExecStart =描述的方案相同。使用此设置是 可选的。运行此选项中配置的命令后,它是 表示服务已停止,并且剩余的任何进程 它根据KillMode =设置终止(请参阅 systemd.kill(5))。如果未指定此选项,则过程为 通过在服务时发送KillSignal =中指定的信号来终止 请求停止。指定符和环境变量替换为 支持(包括$ MAINPID,请参见上文)。
如下面的注释所示,此解决方案可能不适用于KillMode
文件中的Watchdog
选项。