我是 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)