我有一个程序由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')从程序中捕获一些信息.我该怎么做?
添加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。
| 归档时间: |
|
| 查看次数: |
248 次 |
| 最近记录: |