当服务失败时运行任意命令

tsh*_*ang 13 systemd

我想在服务失败时运行一些脚本。我看到的最接近的是FailureAction=选项(在[Service]部分下),但它只提供重启命令。

int*_*lfx 11

节中有一个OnFailure=指令[Unit],记录在systemd.unit(5) 中。它的定义如下:

当该单元进入“失败”状态时激活的一个或多个单元的空格分隔列表。

OnFailureJobMode=在同一部分还有一个指令允许设置作业模式以激活 OnFailure= 单元。)

  • @Tshepang:当然。在 systemd 中,一个单元是做任何事情的基本*单元*。为您的脚本编写一个简单的单元,将它放在 `/etc/systemd/system` 下,并将其名称放在 `OnFailure=` 指令中。 (2认同)

shr*_*use 10

您还可以ExecStopPost直接运行命令而不是启动单元。

\n\n

我对这个设置不满意,OnFailure所以我继续寻找并找到了ExecStopPost

\n\n

下面的真实示例,如果主任务失败,那么 systemd 将运行命令git

\n\n
[Unit]\nDescription=SRI Dispenser Server\nConditionPathExists=|/usr/bin/\nAfter=sri-boot-dsp.service\n\n[Service]\nWorkingDirectory=/usr/share/sri/configurations/transmitter\n\nUser=root\n\n# This is task to run when this service starts\nExecStart=/usr/bin/python -m sri.DispenserServer\n\n# If any of the ExecStart tasks fail, then ExecStopPost will run\nExecStopPost=/bin/git checkout -- .\n\nRestart=always\nRestartSec=10\nKillSignal=SIGKILL\n\n\n[Install]\nWantedBy=multi-user.target\n
Run Code Online (Sandbox Code Playgroud)\n\n

https://www.freedesktop.org/software/systemd/man/systemd.service.html

\n\n
\n

ExecStopPost= 服务停止后\n 执行的附加命令。这包括使用 ExecStop= 中配置的命令、服务未定义任何 ExecStop=\n 或服务意外退出的情况。此参数采用多个命令行,遵循 ExecStart= 中描述的相同方案。这些设置的使用是可选的。支持说明符和\n环境变量替换。请注意,\xe2\x80\x93 与\n ExecStop= \xe2\x80\x93 不同,当服务无法正确启动并再次关闭时,将调用使用此设置指定的\n ExecStop= \xe2\x80\x93 命令。

\n\n

建议使用此设置进行清理操作,\n 即使服务无法正确启动,\n 也应执行这些操作。\n 使用此设置配置的命令需要能够运行,\n 即使服务启动失败中途并留下不完整的\n初始化数据。由于执行此设置指定的命令时服务进程已终止,因此它们不应尝试与它们通信。

\n\n

请注意,使用此设置配置的所有命令都将使用服务的结果代码以及在 $SERVICE_RESULT、$EXIT_CODE\n 和 $EXIT_STATUS 中设置的主\n 进程的退出代码和状态来调用环境变量,请参阅 systemd.exec(5) 了解详细信息。

\n
\n