Bash脚本识别正在运行的进程?

时间:2018-01-09 03:27:17

标签: bash shell

我已经整理了一个bash脚本来识别进程并在进程正在运行时回显。我的剧本:

> db.foo.find().pretty()
{ "_id" : 1, "items" : { "_id" : 1, "transactions" : [ ] } }
{
    "_id" : 2,
    "items" : {
        "_id" : 2,
        "transactions" : [
            {
                "_id" : "5a536dc1bc9b2113986a9047",
                "price" : 5.56
            },
            {
                "_id" : "5a536e1bbc9b2113986a904e",
                "price" : 11.56
            }
        ]
    }
}
{ "_id" : 3, "items" : { "_id" : 1, "transactions" : [ ] } }
> 

我从Var1变量中获取输出但是代码仍然在我的“if-condition'有这个错误:

#!/bin/bash

var1=$(ps -ef | grep -v grep | grep crond)
echo $var1
if [$var1]
then
echo "The Process is Running"
else
echo "The process is not running"
fi
在这种情况下,

spidmd07是另一个正在运行" Crond"的实例的用户。过程

3 个答案:

答案 0 :(得分:3)

是的,如果错误的话,你已经得到了括号的语法。您可以使用[[[,但两者都需要一个空格(有关经典测试程序的详细信息,请参阅man [)。

但是,我认为你希望这个工作不只是crond,所以我把它变成了一个带有arg的脚本。

$ cat is_cmd_running.sh 
#!/bin/bash

psout=$(ps -ef | grep -v grep | grep -v $0 | grep $1) 
if [[ -z ${psout:-} ]]; then
  echo "$1 is not running"
else
  echo "$1 is running"
fi

请注意,除了过滤器-v grep之外,我还必须过滤-v $0或者它自我虚假匹配的程序的ps。这个程序适用于我的系统:

$ bash is_cmd_running.sh firefox
firefox is running
$ bash is_cmd_running.sh konqueror
 konqueror is not running

还有一个更简单的版本,你不测试变量,只是评估上一个grep的返回码。正常的做法是使用-q标志使grep安静然后只评估返回代码。我认为,这在shell脚本中更为传统:

$ cat is_cmd_running.sh 
#!/bin/bash

if ps -ef | grep -v grep | grep -v $0 | grep -q $1 ; then
  echo "$1 is running"
else
  echo "$1 is not running"
fi

这也有效:

$ bash is_cmd_running.sh konqueror
konqueror is not running
$ bash is_cmd_running.sh firefox
firefox is running

编辑:

@tripleee对标准命令的重新实现和短信的重要性提出了一个很好的观点(谢天谢地,我安装了shellcheck)。因此,我提供了shellcheck接受的最终版本,该版本演示了如何直接在流程中使用if'返回代码而不将输出分配给变量:

$ cat is_cmd_running.sh 
#!/bin/bash
if pgrep "$1" >/dev/null ; then
  echo "$1 is running"
else
  echo "$1 is not running"
fi
$ shellcheck is_cmd_running.sh
$ echo $?
0
$

:)

答案 1 :(得分:2)

为一个进程grep ps总是很麻烦。有点像海森堡不确定性原理;你的grep过程会通过显示你想要的结果来影响结果。

如果你想使用grep,你可以调整模式,这样grep进程就不会显示grep [c]ron之类的东西。或者更好的是,使用ps -C选项按命令名称选择ps,然后跳过grep:

if [ -n "$(ps -C crond -o pid=)" ]; then
    # if the ps command returns any string ...
    echo "The Process is Running"
else
    echo "The process is not running"
fi

-o选项可让您选择要打印的内容。在这种情况下,只需要进程ID即可。

答案 2 :(得分:0)

请尝试以下操作并告诉我这是否对您有所帮助。我在[$var]条件下将[[ -n "$var" ]]更改为if的位置。

#!/bin/bash

var1=$(ps -ef | grep -v grep | grep crond)
echo "$var1"
if [[ -n "$var1" ]]
then
    echo "The Process is Running"
else
    echo "The process is not running"
fi