php的shell脚本获取服务器ip,php 执行linux命令,shell脚本函数,获取服务器运行状态值...

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/Blog/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等等。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值