我有一个小的bash脚本(check_status),我试图通过它来了解进程是否正在运行。
#!/bin/bash
# check argument
if ["$1" == ""];
then
echo "Invalid argument"
exit 3
fi
PN=$(ps -ef | grep $1 | wc -l)
echo "process is $1: executing $PN"
if [ $PN -gt 1 ];
then
status=OK
message=UP
exit=0
else
status=CRITICAL
message=DOWN
exit=2
fi
echo "$status - $1 is $message"
exit $exit
但是,当我从shell sh checkstatus xyz
运行它时,我得到了这个:
check_status: 3: check_status: [xyz: not found
process is xyz: executing 3
OK - xyz is UP
现在,我的第一个问题是check_status: 3: check_status: [xyz: not found
错误。我不知道它出现的原因。
接下来,我的服务器中没有运行xyz进程。所以,根据我的理解,我在shell中运行ps -ef | grep xyz | wc -l
,如果没有进程正在运行,它应该回显1
。但是,我得到了3。
我该如何解决这个问题?
更新
我将if ["$1" == ""];
更改为if [ "$1" = "" ]
现在我没有收到错误。但我的PN=$(ps -ef | grep $1 | wc -l)
仍在返回3.
然后我将PN=$(ps -ef | grep $1 | wc -l)
更新为PN=$(ps -ef | grep $1 )
,这给了我以下回复:
admin 14674 4570 0 12:03 pts/2 00:00:00 sh check_status xyz
admin 14675 14674 0 12:03 pts/2 00:00:00 sh check_status xyz
admin 14677 14675 0 12:03 pts/2 00:00:00 grep xyz
一个sh check_status xyz
和一个grep xyz
让我感到满意。但是,任何想法为什么我看到他们中的两个?
答案 0 :(得分:1)
(1)如其他地方所述,你需要“[”和“]”周围的空格。
(2)如果ps
支持-c选项,则应考虑使用它。否则,如果使用ps
,则需要以某种方式解析输出。 (您可能希望插入“| tee / dev / tty”来查看ps命令生成的内容。)但grep(或pgrep)真的是你想要的吗?你的脚本正在生成的消息建议不然。
(3)例如,如果您想要基本名称的完全匹配,请考虑以下内容(分为不同的步骤,以便您可以更轻松地根据您的目的进行调整):
ps -c | awk '{print $4}' | grep "^$x\$"
答案 1 :(得分:0)
除了其他人提到的[
周围的空格外,你应该改变这个:
PN=$(ps -ef | grep $1 | wc -l)
到此:
PN=$(pidof $1 | wc -w)
这将使您计算与您指定的名称匹配的正在运行的进程。
你从原始代码获得比预期更多的计数的原因是因为grep命令还在计数中添加了一个,并且它还会对可能碰巧包含相同字符的任何其他进程产生命中它的名称作为目标进程。使用pidof
可以消除这两个因素。