本文主要是介绍通过Pexpect实现系统监控,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
Pexpect 是 Don Libes 的 Expect 语言的一个 Python 实现,是一个用来启动子程序,并使用正则表达式对程序输出做出特定响应,以此实现与其自动交互的 Python 模块。[b]1.Expect的主要流程[/b]:
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.获取缓冲区的结果。
[b]2.spawn介绍[/b]
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', ['user@example.com'])
child = pexpect.spawn ('ls', ['-latr', '/tmp'])
logfile 参数指定了 Pexpect 产生的日志的记录位置。
比如,ssh.logfile = sys.stdout
[b]3.使用 Pexpect 控制子程序[/b]
为了控制子程序,等待子程序产生特定输出,做出特定的响应,可以使用 expect 方法。方法定义:
expect(self, pattern, timeout=-1, searchwindowsize=None)
pattern 可以是正则表达式, pexpect.EOF , pexpect.TIMEOUT ,或者由这些元素组成的列表
[b]4.打印 before 成员的内容[/b]
child = pexpect.spawn('/bin/ls /')
child.expect (pexpect.EOF)
print child.before
[b]5.通过Pexpect监控应用[/b]
主要的设计思路2部分:
1. 通过Pexpect自动登录到每台服务器
2. 在每台服务器执行命令或分析日志
3. 通过记录输出的内容来监控应用
[b]6.希望做的监控项目[/b]
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,非常慢,可以通过多线程的方式:
[img]http://dl.iteye.com/upload/attachment/0073/0006/9000170d-27d2-3402-b9fa-d58da2b2116c.png[/img]
这篇关于通过Pexpect实现系统监控的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!