运行grep时,Php shell_exec返回不一致的结果

时间:2013-08-27 21:29:31

标签: php apache grep

我希望有人可以启发我并解释以下行为。

在php中使用shell_exec时,以下代码在shell中直接通过php运行并通过网页上的Apache运行时会产生不同的结果。并不是我期望值(cpu,进程数,ram等)完全相同,因为这是不可能的。问题是一些线(顶部的总和)完全缺失。

示例很简单,因此应该可以在apache / phe服务器上重现

php代码如下:

<?php
  $command = 'top -b -n1';
  $commandoutput = shell_exec($command);
  echo strlen($commandoutput);

  echo ":";

  $command = 'top -b -n1 | grep -e "^\s*[a-Z]"';
  $commandoutput = shell_exec($command);
  echo strlen($commandoutput);
?>

当直接在shell中以www-data(php test.php)运行时,我得到以下结果:

8147:450

但是当我通过网页(http://MY.SERVER/test.php)运行完全相同的代码时,我得到了结果:

8147:0

如果我打印变量$ commandoutput,很容易看出缺少什么。不知何故,顶部的顶部被遗漏了。以下行是由于某种原因在通过grep传输之后未包含在网页上。

top - 23:17:13 up 29 days,  9:20,  3 users,  load average: 0.67, 0.85, 0.72
Tasks:  93 total,   1 running,  92 sleeping,   0 stopped,   0 zombie
Cpu(s):  5.9%us,  4.4%sy,  0.0%ni, 89.5%id,  0.1%wa,  0.0%hi,  0.0%si,  0.0%st
Mem:    507452k total,   453176k used,    54276k free,    41024k buffers
Swap:   407544k total,    40524k used,   367020k free,   287916k cached

  PID USER      PR  NI  VIRT  RES  SHR S %CPU %MEM    TIME+  COMMAND

我不认为这是一个权限问题,因为不使用grep时结果是正确的。 grep做什么魔法会干扰shell_exec。我简单无法理解shell_exec如何根据我运行脚本的方式返回不同的结果。

任何人都可以解释发生了什么,或者至少引导我朝着正确的方向前进吗?

其他信息: 另一个例子:

在上面的示例中,通过apache运行代码使得grep不正确匹配,导致行数少于预期。

如果我将正则表达式颠倒并匹配我不想要的行

  

top -b -n1 | grep -v -e“^ \ s * [0-9]”

这一次,当浏览网页时,我得到太多行。我可以在案例之间看到的唯一链接如下。 Grep匹配在两个测试中都失败了,但是由于我在第二种情况下反转了匹配,它现在返回每一行而不是返回任何内容。

我仍然不知道为什么会这样。

0 个答案:

没有答案