目的很简单,用一个脚本,判断用户输入的参数,是否有对应的进程存在,根据进程是否在运行,给出不同的信息。
看起来脚本很好写,接受用户传来的参数,用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
到这里,脚本已达到目的。