处理 systemd 服务返回码的脚本

处理 systemd 服务返回码的脚本

我正在编写一个可以使用 systemctl 命令启动或停止的 systemd 服务。

但是,该程序也可以返回多个返回代码,我想处理这些返回代码。

例如,如果服务被停止,systemctl stop <service>它不应该执行任何操作。但是,如果它没有被 systemctl 杀死并自行返回,我想运行一个后脚本,在该脚本上我可以获取返回代码并根据其值执行操作。


在 @NarūnasK 回答后修改
当 systemd 版本 >= v232 时,@NarūnasK 回答就可以了


但是,如果没有好的 systemd 版本,那怎么办呢?

我想做一些类似的事情

ExecStart=/bin/sh -c '<service> -C /etc/<service_conf_file>; [ $? -eq 1 ] && { <action> }'

答案1

执行停止后=应该做你想做的事。

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

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

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

在您的脚本中,您可以读取环境$EXIT_CODE变量$EXIT_STATUS并采取适当的操作。

编辑

您可以使用以下解决方法systemd < 232

样本脚本:

#! /bin/bash --

sleep 5

## Non standard exit code
exit 255

退出处理程序:

#! /bin/bash --

CODE="${1:-N/A}"

echo CODE: $CODE
echo SERVICE_RESULT: $SERVICE_RESULT
echo EXIT_CODE: $EXIT_CODE
echo EXIT_STATUS: $EXIT_STATUS

样本脚本.service:

# systemctl cat sample_script.service 
# /etc/systemd/system/sample_script.service
[Unit]
Description=My service
After=network.target rsyslog.service

[Service]
Type=simple
Restart=never
ExecStart=/bin/bash -c '/tmp/sample_script || /tmp/exit_handler $?'
ExecStopPost=/tmp/exit_handler

[Install]
WantedBy=multi-user.target

的现状样本脚本.service:

# systemctl status sample_script.service 
● sample_script.service - My service
   Loaded: loaded (/etc/systemd/system/sample_script.service; enabled)
   Active: inactive (dead) since Thu 2017-12-14 12:29:16 GMT; 7s ago
  Process: 16511 ExecStopPost=/tmp/exit_handler (code=exited, status=0/SUCCESS)
  Process: 16505 ExecStart=/bin/bash -c /tmp/sample_script || /tmp/exit_handler $? (code=exited, status=0/SUCCESS)
 Main PID: 16505 (code=exited, status=0/SUCCESS)

Dec 14 12:29:11 build-local systemd[1]: Started My service.
Dec 14 12:29:16 build-local bash[16505]: CODE: 255
Dec 14 12:29:16 build-local bash[16505]: SERVICE_RESULT:
Dec 14 12:29:16 build-local bash[16505]: EXIT_CODE:
Dec 14 12:29:16 build-local bash[16505]: EXIT_STATUS:
Dec 14 12:29:16 build-local exit_handler[16511]: CODE: N/A
Dec 14 12:29:16 build-local exit_handler[16511]: SERVICE_RESULT:
Dec 14 12:29:16 build-local exit_handler[16511]: EXIT_CODE:
Dec 14 12:29:16 build-local exit_handler[16511]: EXIT_STATUS:

你可以看到它exit_handler被调用了两次。首先从bash它提供的退出代码开始,然后作为ExecStopPost=脚本,其中未提供退出代码的位置参数,因此它打印 N/A。

相关内容