php 执行linux命令,shell脚本函数,获取服务器运行状态值
2016-11-20 14:50
2051 查看
php 执行shell命令函数,获取服务器运行状态值
最近做到一个监测服务器运行状态相关的东西。需要通过php来调用shell命令来获取所需的信息。下面就从获取服务器信息简单介绍一下这几个常用相关函数。
1、exec()
exec($command, array &output = null, &return_var = null)有三个参数。执行给定的命令,但不输出结果,而是返回结果的最后一行。虽然它只返回命令结果的最后一行,但用第二个参数array 可以得到完整的结果,方法是把结果逐行追加到array的结尾处。所以如果array不是空的,在调用之前最好用unset()最它清掉。只有指定了第二 个参数时,才可以用第三个参数,用来取得命令执行的状态码。举个栗子:
$out01 = exec('ls -l'); exec('ls -l',$arr); echo '只读取结果的最后一行'.$out01."\n"; var_dump('以数组的形式返回所有的输出'.$arr);
结果:
/usr/bin/php /Users/tao/PhpSites/csdnBlog/shell/shell.php 只读取结果的最后一行-rw-r--r-- 1 tao staff 576 Nov 20 14:14 shell.php string(44) "以数组的形式返回所有的输出Array" -rw-r--r-- 1 tao staff 576 Nov 20 14:14 shell.php
2、shell_exec()
shell_exec($cmd)只有一个参数,它会获取$cdm执行之后所有的数据。栗子1:
$connect_num = shell_exec('netstat -nat|grep -i "80"|wc -l');//获取当前服务器的80端口连接数 connect_num的值就是后面linux命令执行之后的输出内容
栗子2:
$out02 = shell_exec('ls -l');
结果:
shell_exec()获取所有的返回值 total 8 -rw-r--r-- 1 tao staff 638 Nov 20 14:18 shell.php
exec()和exec_shell()的区别
In short; exec()只返回$cmd命令的最后一行,exec_shell()返回全部的数据,假设最终的命令只有一行,那就随便选择了。但是,exec()命令的后两个参数,让我们可以以数组的操作方式去操作得到的数据,在某些case下,应该比读exec_shell获的的文本的数据强吧。并且还有状态码的返回。应该有些用处吧orz3、system()
4、popen()
popen函数的执行流程:1、使用pipe系统调用创建一个管道
2、创建一个新的进程,将拷贝标准输入或者标准输出到文件描述符。
3、关闭pipe返回的文件描述符。
4、调用execve系统调用来执行命令。
5、关闭管道
popen($cmd,$status)是通过”管道”的机制,来创建一个进程,进而来执行$cmd命令的,$status是管道的两种状态,分别是”r”和”w”,而上面所说的命令只有”r”的方式,当执行完shell命令之后,popen的返回值是一个普通的标准I/O流,所以必须要用pclose()将其关闭。
P.S.数据流的基本概念:
数据流是一串连续不断的数据的集合,就象水管里的水流,在水管的一端一点一点地供水,而在水管的另一端看到的是一股连续不断的水流。
数据写入程序可以是一段一段地向数据流管道中写入数据,这些数据段会按先后顺序形成一个长的数据流。
对数据读取程序来说,看不到数据流在写入时的分段情况,每次可以读取其中的任意长度的数据,但只能先读取前面的数据后,再读取后面的数据。
不管写入时是将数据分多次写入,还是作为一个整体一次写入,读取时的效果都是完全一样的。
举个栗子:
//所有连接到本机80端口的IP地址和其连接数。80端口一般是用来处理HTTP网页请求 $fp = popen('netstat -plan|grep :80|awk {\'print $5\'}|cut -d: -f 1|sort|uniq -c|sort -nk 1', "r"); $online_num = 0; while (!feof($fp)) { if(!feof($fp)){ $online_num += 1; } } pclose($fp); ``` 再举个栗子: ``` //获取某一时刻系统cpu和内存使用情况 $fp = popen('top -b -n 2 | grep -E "^(%Cpu|KiB Mem|Tasks)"', "r"); $rs = ""; while (!feof($fp)) { $rs .= fread($fp, 1024); } pclose($fp);
看起来是不是普通文件的读取操作相似,将fp当做操作文本时候的简单的句柄,然后进行对I/O的操作就OK了、、
in the end
还有很多php来操作linux命令和shell脚本的函数,例如system、passthru等等。相关文章推荐
- Linux执行shell脚本方式及区别&命令后台运行
- PHP在Linux下Apache环境中执行exec,system,passthru等服务器命令函数
- linux c之通过popen和pclose函数创建管道执行shell 运行命令使用总结
- Linux执行shell脚本方式及区别&命令后台运行
- Linux执行shell脚本方式及区别&命令后台运行
- Linux下一个shell脚本中的命令在多个服务器上执行
- Linux执行shell脚本方式及区别&命令后台运行
- Linux执行shell脚本方式及区别&命令后台运行
- Linux执行shell脚本方式及区别&命令后台运行
- linux C程序中获取shell脚本输出(如获取system命令输出)
- Linux新手生存笔记[10]——shell脚本基础3-函数及常用命令
- Linux 记录服务器负载、内存、cpu状态的PHP脚本
- python学习五:执行linux命令的两种方法、提高运行效率、进制转换、切片详解、ip和mac获取
- 在linux应用程序使用system函数执行简单的shell交互命令的方法
- 在Linux下获取当前运行程序可执行文件全路径(不使用real_path()函数)
- php调用Linux命令成功执行但函数不返回[已解决]
- PHP的几个执行linux命令的函数笔记
- Linux 记录服务器负载、内存、cpu状态的PHP脚本
- Linux新手生存笔记[10]——shell脚本基础3-函数及常用命令
- Linux/shell命令的实际应用——while;do;循环执行脚本