如何处理 systemctl 的特定输出?

如何处理 systemctl 的特定输出?

我是 bash/shell 脚本编写的初学者,当未找到特定服务时,我尝试处理来自 systemctl 的特定输出。例如,当我运行systemctl status xyz返回的输出时,Unit xyz could not be found.如果找不到服务,我想更新一个变量来保存字符串ServiceName="xyz service not found"。如果找到服务,我根本不想更新变量并保持不变。

这是尝试查找特定服务是否正在运行并将变量的输出存储在发送到 s3 的 csv 文件中的工作的一部分,然后我可以通过 aws Athena 查询存储桶。 (我已经实现了这个,只是提供额外的信息)。

到目前为止我已经尝试过

#!/usr/bin/env bash
serviceName=$(systemctl status xyz | head -n 1 | cut -c 3-)

if [[ $serviceName$(systemctl status xyz | grep 'could not be found') ]]; then
        serviceName="xyz not found"
else
        serviceName=$(systemctl status xyz | head -n 1 | cut -c 3-)
fi

它从运行 bash test.sh 返回(包含所提供代码的文件的名称)。

Unit xyz could not be found.
Unit xyz could not be found.
Unit xyz could not be found.

我正在使用其他命令运行此命令,因此我不希望在失败时退出整个脚本。

先感谢您。

答案1

当您运行systemctl status someservice它时可以返回这些退出状态:

价值 LSB 描述 在系统中使用
0 “程序正在运行或服务正常” 单位处于活动状态
1 “程序已死,/var/run pid 文件存在” 单元未失败(由 is-failed 使用)
2 “程序已死,/var/lock 锁定文件存在” 没用过
3 “程序没有运行” 单位未激活
4 “程序或服务状态未知” 没有这个单位

所以在这种情况下我们关心4退出状态。然后你可以使用这个脚本:

systemctl status xyz

if [ "$?" -eq 4 ]; then
   serviceName="xyz service not found"
fi

顺便说一句,在您的情况下,此分配serviceName=$(systemctl status xyz)不起作用,因为变量实际上是空的(因为当此systemctl status操作失败时4,会将输出发送到stderr)。因此,如果您也想存储两者stderr,您可以使用:

serviceName=$(systemctl status xyz 2>&1)

相关内容