如何确定bash脚本中新贵作业的状态?


10

您如何确定Bash脚本中是否正在运行暴发户作业?那就是我需要一个“布尔”值来做类似的事情:

#!/bin/bash
if [ determine_if_job_x_is_running ]; then
  echo "I see upstart job X is running, please stop it before ..."
fi

Answers:


9

创建您自己的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

2
您可能需要对此进行修改,status $1 2> /dev/null | grep -q "^$1 start" > /dev/null 2> /dev/null以确保它保持沉默。
David G

1

通常,您使用PID文件,但也可以使用pgrep来检查进程。假设您的服务被调用,jobX它将起作用:

if [ $(pgrep jobX) ]; then

甚至更好

if pgrep jobX > /dev/null 2>&1

1

基于bash中包含的String

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退出。


1
一个变体... isRunning = $(status $ {job} | grep running | wc -l)如果正在运行则返回1,否则返回0。
Naraen '17

0

您将使用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

请注意,如果您要编写自己的暴发户作业,则应改用暴发户事件或程序包依赖项。


似乎这样只会打印某种文本状态,然后您必须解析这些文本状态才能获得布尔值,对吗?
laslowh

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.