我已经整理了一个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"的实例的用户。过程
答案 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