如何在 Bash 脚本中确定 Upstart 作业的状态?

如何在 Bash 脚本中确定 Upstart 作业的状态?

如何确定 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

基于字符串包含在 bash 中

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

相关内容