通过Pexpect实现系统监控

Pexpect 是 Don Libes 的 Expect 语言的一个 Python 实现,是一个用来启动子程序,并使用正则表达式对程序输出做出特定响应,以此实现与其自动交互的 Python 模块。

1.Expect的主要流程
ssh = pexpect.spawn('/bin/bash', ['-c', 'ssh %s' %(server)],timeout=1.5)
ssh.sendline("tail -200 /duitang/logs/usr/www.duitang.nginx.access.log ")
ssh.expect([pexpect.EOF,pexpect.TIMEOUT])
print ssh.before

1.通过spawn启动子程序。
2.发送命令。
3.等待子程序产生特定输出,做出特定的响应。
4.获取缓冲区的结果。

2.spawn介绍
spawn 是Pexpect最主要的接口. 使用这个类来启动和控制子程序,其构造函数如下:

class spawn:
    def __init__(self,command,args=[],timeout=30,maxread=2000,\
    searchwindowsize=None, logfile=None, cwd=None, env=None) 


args  当子程序需要参数时,还可以使用一个参数的列表:
child = pexpect.spawn ('/usr/bin/ssh', ['[email protected]'])
child = pexpect.spawn ('ls', ['-latr', '/tmp'])  

logfile 参数指定了 Pexpect 产生的日志的记录位置。
比如,ssh.logfile = sys.stdout

3.使用 Pexpect 控制子程序
为了控制子程序,等待子程序产生特定输出,做出特定的响应,可以使用 expect 方法。方法定义:
expect(self, pattern, timeout=-1, searchwindowsize=None) 

pattern 可以是正则表达式, pexpect.EOF , pexpect.TIMEOUT ,或者由这些元素组成的列表

4.打印 before 成员的内容
child = pexpect.spawn('/bin/ls /')
child.expect (pexpect.EOF)
print child.before

5.通过Pexpect监控应用
主要的设计思路2部分:
1. 通过Pexpect自动登录到每台服务器
2. 在每台服务器执行命令或分析日志
3. 通过记录输出的内容来监控应用

6.希望做的监控项目
1.数据库连接数
2.jvm内存,solr状态
2.web服务器状态
3.web服务器服务器连接数
4.系统load
5.memcached状态
6.ningx,SYN_RECV,统计最近访问频率最高的来源IP,统计最近访问频率最高的URL




检查步骤:
s9 gunicorn
s9 nginx
s9 mani
--------------
s8 gunicorn
s8 mani
返回数据格式:
{
    nginx:[{'s1':''},{'s9':''}],
    mysql:[{"s10":"连接数:1003"},{"s11":"连接数:200"}],   
}

参考:
http://www.ibm.com/developerworks/cn/linux/l-cn-pexpect1/
http://www.ibm.com/developerworks/cn/linux/l-cn-pexpect2/


后记:
前面的方案存在一个问题,每台机器都要执行一遍ssh,非常慢,可以通过多线程的方式:



猜你喜欢

转载自san-yun.iteye.com/blog/1656533
今日推荐