如何确定 upstart 作业是否在 Bash 脚本中运行?也就是说,我需要一个“布尔”值来执行如下操作:
#!/bin/bash
if [ determine_if_job_x_is_running ]; then
echo "I see upstart job X is running, please stop it before ..."
fi
答案1
创建你自己的 Bash 函数并将其放入你的~/.bashrc
:
check_upstart_service(){
status $1 | grep -q "^$1 start" > /dev/null
return $?
}
我真的不喜欢解析输出的方式,但我没有看到其他明显的方式。在这种情况下,的输出<service name> start
非常可靠,因为它在Upstart 文档。
现在你可以像这样使用它:
if check_upstart_service ssh; then echo "running"; else echo "stopped"; fi
答案2
通常情况下,你会使用 PID 文件,但你也可以使用 pgrep 来检查你的进程。假设你的服务被调用,jobX
这将起作用:
if [ $(pgrep jobX) ]; then
甚至更好
if pgrep jobX > /dev/null 2>&1
答案3
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
将会返回类似
方法返回发送者 =:1.0 -> 目标 =:1.94 reply_serial = 2 变体字符串“正在运行”
并使用上述解决方案检查返回的字符串是否包含“running”。但是,如果作业未运行,dbus 调用将以状态 1 退出,而不是像我预期的那样返回“waiting”。
status ${job}
除非没有这样的工作,否则永远不会以状态 1 退出。
答案4
看起来 upstart status 命令符合 Linux 标准基础项目的 init 脚本规范,这意味着您可以假设退出代码 0 表示程序正在运行,退出代码 1-3 表示程序正在运行,任何其他退出代码表示未定义状态。
看: http://refspecs.linuxbase.org/LSB_3.0.0/LSB-PDA/LSB-PDA/iniscrptact.html