搜索
linux - 什么情况下 ps -ef f | grep "xxx" 不能正常执行?
PHP中文网
PHP中文网 2017-04-17 12:58:59
[Linux讨论组]
#!/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区间呢?

那么应该如何正确理解这段代码呢?

根据一楼同学的解答也就是说代码是有问题的,需要修改

PHP中文网
PHP中文网

认证0级讲师

全部回复(1)
ringa_lee

管道两侧的命令是同时执行的,并不是先执行前面一个,执行完毕后把输出交给后面的命令,所以ps的结果包含 grep "a.php"这条命令,这个命令本身就包含了a.php这个字符串

所以即使没有a.php这个进程,你通过grep依然可以执行成功,进一步说,ps之后grep任何普通字符串都可以成功

xelz@ubuntu: ~ [12:01:40]
$ ps -ef | grep any_thing_you_want ; echo $?
xelz     30076 29945  0 12:04 pts/0    00:00:00 grep --color=auto any_thing_you_want
0

解决办法

你可以再grep一次,过滤掉 grep命令本身

ps -ef f | grep 'a.php' | grep -v grep

还有一种trick的方式是使用bracket expression,类似正则表达式的[]

ps -ef f | grep [a].php

[a]表示括号里面的字符任选其一,这里其实就是代表a,也就是grep a.php,但是实际上ps命令获得的grep命令参数是 grep [a].php,并不包含a.php这样一个字符串,可以避免grep命令自身被ps捕捉到

热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板