目的很简单,用一个脚本,判断用户输入的参数,是否有对应的进程存在,根据进程是否在运行,给出不同的信息。


看起来脚本很好写,接受用户传来的参数,用ps -ef  | grep 进程名 进行检测,然后根据返回信息,给用户不同的提示就可以,但写得过程中,出现了一些问题。


首先看初始脚本,下面这个脚本式有问题的,不论用户传什么参数,都会提示有对应的进程运行。

#!/bin/bash
PROC=$1
RET=$(ps -ef | grep $PROC | grep -v grep | wc -l)
if [ $RET -gt 1  ]
then
echo  "$PROC is running"
else
echo "no $PROC running"
fi


运行脚本,测试是否能达到检测进程的目的


sh test-1.sh  aaaaaa
aaaaaa is running


显然,这是错误的,为什么呢?


这和脚本的运行有关,当脚本在运行的时候,脚本自身运行,就会有一个对应的进程,那么这个进程,是如何显示在 ps  -ef 里面的呢?


我们可以把上面的脚本改改,加上延时,并另外开启一个终端,看看就明白了


#!/bin/bash
RET=$(ps -ef  | grep  $1  | grep  -v  grep  | grep  -v $0 | wc -l)
sleep  10


运行这个脚本,并另外开启一个终端(比如,可以用SecureCRT的克隆会话功能去开启另外一个会话)


sh test7.sh   aaaaa
#开启另外一个终端,查看
ps -ef  | grep  aaaaa
root     32325 32168  0 13:15 pts/1    00:00:00 sh test7.sh aaaaa
root     32334 32296  0 13:15 pts/2    00:00:00 grep aaaaa


看到这里,相信各位都明白了,该脚本自身运行,必然有一个进程,而该进程在ps -ef里面的显示的名字,就是 用户所传入的全部参数,即$0,在这里,也就是sh test7.sh aaaaa,那么,在脚本里面用grep 去检查有没有aaaaa这个进程,必然会显示是有的


那么,怎么用脚本去检查用户传参来的进程呢?


其实,看了上面讲的,就知道干扰的原因,那么排除干扰就可以了,也就是过滤掉这个脚本执行时对应的整个命令行。

#!/bin/bash
PROC=$1
RET=` ps -ef  | grep $PROC | grep -v  grep |grep -v $0 | wc -l`
if [ $RET -gt 1  ]
then
echo "$PROC running"
else
echo  "$PROC not running"
fi


再来运行这个脚本,检测效果:

sh test.sh   ssh
ssh running
[root@cahoa ~]# sh test.sh   aaa
aaa not running


到这里,脚本已达到目的。