服务失败时运行任意命令


11

我想在服务失败时运行一些脚本。我所看到的与此FailureAction=选项最接近的选项(在本[Service]节下面),但是它仅提供重新启动命令。

Answers:


11

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

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

OnFailureJobMode=同一部分中还有一条指令,该指令允许设置作业模式以激活OnFailure =单位。)


看起来这些选项启动了其他单元,而不是脚本。
tshepang 2015年

2
@Tshepang:当然可以。在systemd中,一个单元是做任何事情的基本单元。为您的脚本编写一个简单的单元,将其放在下面/etc/systemd/system并将其名称放置在OnFailure=指令中。
intelfx

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)详细。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.