#!/bin/bash
cd /script/path
STAT=`ps -ef f | grep "a.php"`
if [ $? -eq 0 ];then
:
else
php /script/path/a.php &
fi
代码不是我写的,该脚本5分钟跑一次。
我猜大概意思是:如果通过ps -ef f | grep "a.php"
命令没有找到a.php
的进程,那么就再启动一次;如果有则不用管。
但是我发现不管a.php
是否有进程ps -ef f | grep "a.php"
的执行结果都是正常的呀。这样下面判断条件中的$?
就永远是0
也就是说不管grep什么都会正常执行。那怎么才能走到else
区间呢?
那么应该如何正确理解这段代码呢?
管道两侧的命令是同时执行的,并不是先执行前面一个,执行完毕后把输出交给后面的命令,所以
ps
的结果包含grep "a.php"
这条命令,这个命令本身就包含了a.php
这个字符串所以即使没有
a.php
这个进程,你通过grep
依然可以执行成功,进一步说,ps
之后grep
任何普通字符串都可以成功解决办法
你可以再
grep
一次,过滤掉grep
命令本身还有一种trick的方式是使用
bracket expression
,类似正则表达式的[]
[a]
表示括号里面的字符任选其一,这里其实就是代表a
,也就是grep a.php
,但是实际上ps
命令获得的grep
命令参数是grep [a].php
,并不包含a.php
这样一个字符串,可以避免grep
命令自身被ps
捕捉到