您的位置:首页 > 运维架构 > Shell

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获的的文本的数据强吧。并且还有状态码的返回。应该有些用处吧orz

3、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等等。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息