![当服务失败时运行任意命令](https://linux22.com/image/63434/%E5%BD%93%E6%9C%8D%E5%8A%A1%E5%A4%B1%E8%B4%A5%E6%97%B6%E8%BF%90%E8%A1%8C%E4%BB%BB%E6%84%8F%E5%91%BD%E4%BB%A4.png)
我想在服务失败时运行一些脚本。我看到的最接近的是FailureAction=
选项(在[Service]
部分下),但它只提供重新启动命令。
答案1
OnFailure=
节中有一个指令[Unit]
,记录在系统单元(5)。它的定义如下:
当该单元进入“失败”状态时激活的一个或多个单元的以空格分隔的列表。
(同一部分中还有一个OnFailureJobMode=
指令,允许设置作业模式以激活 OnFailure= 单位。)
答案2
您还可以ExecStopPost
直接运行命令而不是启动单元。
我对这个设置不满意,OnFailure
所以我继续寻找并找到了ExecStopPost
。
下面的真实示例,如果主任务失败,那么 systemd 将运行git
命令。
[Unit]
Description=SRI Dispenser Server
ConditionPathExists=|/usr/bin/
After=sri-boot-dsp.service
[Service]
WorkingDirectory=/usr/share/sri/configurations/transmitter
User=root
# This is task to run when this service starts
ExecStart=/usr/bin/python -m sri.DispenserServer
# If any of the ExecStart tasks fail, then ExecStopPost will run
ExecStopPost=/bin/git checkout -- .
Restart=always
RestartSec=10
KillSignal=SIGKILL
[Install]
WantedBy=multi-user.target
https://www.freedesktop.org/software/systemd/man/systemd.service.html
ExecStopPost= 服务停止后执行的附加命令。这包括使用 ExecStop= 中配置的命令、服务未定义任何 ExecStop= 或服务意外退出的情况。此参数采用多个命令行,遵循与 ExecStart= 描述的相同方案。这些设置的使用是可选的。支持说明符和环境变量替换。请注意,与 ExecStop= 不同的是,当服务无法正确启动并再次关闭时,将调用使用此设置指定的命令。
建议使用此设置进行清理操作,即使服务无法正确启动也应执行这些操作。即使服务中途启动失败并留下未完全初始化的数据,使用此设置配置的命令也需要能够运行。由于在执行使用此设置指定的命令时服务的进程已经终止,因此它们不应尝试与它们通信。
请注意,使用此设置配置的所有命令都将使用服务的结果代码以及主进程的退出代码和状态进行调用,这些代码和状态在 $SERVICE_RESULT、$EXIT_CODE 和 $EXIT_STATUS 环境变量中设置,请参阅 systemd.exec (5) 详细信息。