Answers:
创建您自己的Bash函数并将其放入您的~/.bashrc
:
check_upstart_service(){
status $1 | grep -q "^$1 start" > /dev/null
return $?
}
我真的不喜欢解析输出的方式,但是我看不到另一种明显的方式。在这种情况下,Upstart文档中<service name> start
指定的输出非常可靠。
现在您可以像这样使用它:
if check_upstart_service ssh; then echo "running"; else echo "stopped"; fi
job='your_job_name'
job_status=$(status ${job})
if [[ ${job_status} == *running* ]]
then
# do whatever you need
else
# do whatever you need
fi
我的第一个冲动是使用ImaginaryRobots提供的代码变体
job='your_job_name'
dbus-send --system --print-reply --dest=com.ubuntu.Upstart \
/com/ubuntu/Upstart/jobs/${job}/_ \
org.freedesktop.DBus.Properties.Get string:'' string:state
这将返回类似
方法return sender =:1.0-> dest =:1.94 reply_serial = 2变体字符串“正在运行”
并使用上述解决方案检查返回的字符串是否包含“ running”。但是,如果作业未运行,则dbus调用将以状态1退出,而是返回“等待中”,正如我所期望的那样。
status ${job}
除非没有这样的工作,否则永远不会以状态1退出。
您将使用DBUS查询该特定服务的状态。
$ job=myjob
$ dbus-send --system --print-reply --dest=com.ubuntu.Upstart /com/ubuntu/Upstart/jobs/${job}/_ org.freedesktop.DBus.Properties.GetAll string:''
http://upstart.ubuntu.com/cookbook/#get-status-of-job-via-d-bus
请注意,如果您要编写自己的暴发户作业,则应改用暴发户事件或程序包依赖项。
看来upstart status命令符合Linux Standard Base项目中的init脚本规范,这意味着您可以假设退出代码为0表示程序正在运行,退出代码为1-3表示它正在运行,并且任何其他退出代码表示状态未定义。
请参阅:http : //refspecs.linuxbase.org/LSB_3.0.0/LSB-PDA/LSB-PDA/iniscrptact.html
status $1 2> /dev/null | grep -q "^$1 start" > /dev/null 2> /dev/null
以确保它保持沉默。