系统单元,使用外部脚本检查状态
Systemd unit, check status with external script
简短版本是:
我有一个 systemd 单元,我想在调用时检查脚本的 return 代码:
systemctl status service.service
长版本:我有一个 lsb 初始化脚本,它正是这样做的,当状态作为参数传递时,它调用一个脚本来检查几个进程的状态,并根据 return 代码初始化系统 return正确编辑了软件的状态。
现在,在将脚本改编为 systemd 时,我找不到如何配置此行为。
简答
这在 systemd 中是不可能的。 systemctl status
动词总是做同样的事情,它不能按单元覆盖到自定义操作。
长答案
您可以编写一个 foo-status.service
单元文件,其中 Type=oneshot
和 ExecStart=
指向您的自定义状态脚本,然后 运行 systemctl start foo-status
。但是,这只会提供 zero/nonzero 信息(任何非零退出代码都将转换为 1)。
要获取您的状态脚本的真正退出代码,运行 systemctl show -pExecMainStatus foo-status
,但是,如果您走到这一步,那么直接 运行 您的脚本会更简单。
如果您以这种方式控制启动/停止服务的代码,那么您可以轻松编辑它并将结果保存在文件中。
否则,您可以随时添加一个包装器来为您完成此操作。
#!/bin/sh
/path/to/service and args here
echo $? >/run/service.result
然后可以使用该文件的内容访问您的状态:
STATUS=`cat /run/service.result`
if test $STATUS = 1
then
echo "An error occurred..."
fi
(旁注:/run/
只能由 root 写入,如果您不是 root,请使用 /tmp/
。)
您可以使用:
systemctl show -p ExecMainStatus service.service | sed 's/ExecMainStatus=//g'
这将 return 服务的退出代码。
简短版本是:
我有一个 systemd 单元,我想在调用时检查脚本的 return 代码:
systemctl status service.service
长版本:我有一个 lsb 初始化脚本,它正是这样做的,当状态作为参数传递时,它调用一个脚本来检查几个进程的状态,并根据 return 代码初始化系统 return正确编辑了软件的状态。
现在,在将脚本改编为 systemd 时,我找不到如何配置此行为。
简答
这在 systemd 中是不可能的。 systemctl status
动词总是做同样的事情,它不能按单元覆盖到自定义操作。
长答案
您可以编写一个 foo-status.service
单元文件,其中 Type=oneshot
和 ExecStart=
指向您的自定义状态脚本,然后 运行 systemctl start foo-status
。但是,这只会提供 zero/nonzero 信息(任何非零退出代码都将转换为 1)。
要获取您的状态脚本的真正退出代码,运行 systemctl show -pExecMainStatus foo-status
,但是,如果您走到这一步,那么直接 运行 您的脚本会更简单。
如果您以这种方式控制启动/停止服务的代码,那么您可以轻松编辑它并将结果保存在文件中。
否则,您可以随时添加一个包装器来为您完成此操作。
#!/bin/sh
/path/to/service and args here
echo $? >/run/service.result
然后可以使用该文件的内容访问您的状态:
STATUS=`cat /run/service.result`
if test $STATUS = 1
then
echo "An error occurred..."
fi
(旁注:/run/
只能由 root 写入,如果您不是 root,请使用 /tmp/
。)
您可以使用:
systemctl show -p ExecMainStatus service.service | sed 's/ExecMainStatus=//g'
这将 return 服务的退出代码。