问题:
monitor.php
<?php
var_dump(exec('top -n 1 |grep Cpu 2>err.txt ',$r, $r2));
var_dump($r);
var_dump($r2);
?>
写了这样一个php,在命令行使用php monitor.php成功输出结果。但是在浏览器访问没有输出,也不报错。
不报错原因:
使用了管道|,则不会报出错误。去掉管道,发现错误为TERM environment variable not set.
解决办法:
搜索该错误,发现php.net提供了一种方法如下:
Remember that some shell commands in *NIX needs you to set a TERM enviroment. For example:
<?php
exec('top n 1 b i', $top, $error );
echo nl2br(implode("\n",$top));
if ($error){
exec('/usr/bin/top n 1 b 2>&1', $error );
echo "Error: ";
exit($error[0]);
}
?>
This will echo "Error: TERM enviroment variable not set. " To fix it, add TERM=xterm (Or some other terminal) to the exec-statement, like this
<?php
exec('TERM=xterm /usr/bin/top n 1 b i', $top, $error );
echo nl2br(implode("\n",$top));
if ($error){
exec('TERM=xterm /usr/bin/top n 1 b 2>&1', $error );
echo "Error: ";
exit($error[0]);
}
?>
但是为什么命令行执行可以呢?猜想应该跟环境变量有关系吧?shell下面执行php可以看到所有的变量,但是浏览器访问的话只能使用环境变量。
环境变量取值:环境变量TERM设置为终端类型
终端是一个很重要的外设,用过终端设备的人都知道如果设备类型不对就会有乱字符,也可用仿真终端软件如netterm试验一下,linux的终端信息放在 /usr/share/terminfo下,在这个目录的子目录v下就有许多的如vt100,vt102,vt200等,你看一下就知道了。
我的/usr/share/terminfo/v目录下有个vwmterm文件,我尝试了一下
var_dump(exec('TERM=vwmterm top -n 1 i 2>err.txt',$r, $r2));
var_dump($r);
var_dump($r2);
这次又报错了,错误信息为:top: failed tty get
搜索该错误,发现:
通过其他程序或脚本在非交互式模式下调用top命令,经常会出现:
top: failed tty get 错误
解决办法:加个-b 选项皆可
-b : Batch mode operation
Starts top in <A1><AF>Batch mode<A1><AF>, which could be useful for sending output from top to other programs or to a file. In this mode, top will not accept input and runs until the iterations limit you<A1><AF>ve set with the <A1><AF>-n<A1><AF> command-line option or until killed.
例如执行:top -bn 1
因此我把原来代码改为如下就好了:
var_dump(exec('top -n 1 b i 2>err.txt',$r, $r2));
var_dump($r);
var_dump($r2);
这样就可以正常输出了,因此对此类问题的解决方式为,输出错误,根据错误信息更改代码解决错误即可。
总结:
1)用php程序监控服务器运行状态,包括cpu使用率、可用内存大小、已使用内存大小、硬盘分区使用情况、mysql连接数 2)查询指定进程名的进程数
反馈: