在linux下开发或部署的应用程序,都希望能监控它的运行状况,而linux下的原生语言是shell和C。
shell 可以帮我们来做系统管理。比如netstat,ps,systat等都能比较全面的反映某个程序的运行状况。
如果是单台服务器,管理起来倒是不显得困难,但如果是多台机器都要同时监控,shell脚本做起来就显得有些吃力了。此时可以借助python来做一些复杂的工作,如:报告的输出,监控服务器等
下面就举例来说,假如想要远程监控多台mysql服务器的CPU,内存使用状况。
shell的做法是,写一个mysqlMon.exp文件,内容如下:
#!/usr/bin/expect -f
set timeout 60
set host [lindex $argv 0]
set user [lindex $argv 1]
set password [lindex $argv 2]
spawn -noecho ssh $host -l $user
expect {
"yes/no" { send "yes\n";exp_continue}
"*password:" {send "$password\n"}
}
expect "*#"
send "monSQL\n"
expect {
"*mysqld\n" {}
"*#" { send "exit\r"}
}
expect eof
然后就是循环调用这个脚本来实现多台的服务器的监控。
当然有个前提是每个mysql服务器中实现了monSQL命令。
当采用上面的做法后,会发现每次执行需要很长的时间,而且对于命令的结果输出不能简便的控制。
而且当执行其他的命令,如果结果比较复杂,格式很难控制。
尤其是shell的字符串处理不是很方便,而且格式很有讲究。
同样的场景,采用python来做要简单的多,并且容易扩展
#!/usr/bin/python -u
import paramiko
hosts=(
('proxy', '192.168.1.101'),
('master', '192.168.1.116'),
('slave1', '192.168.1.119'),
('slave2', '192.168.1.113'),
('slave3', '192.168.1.115'),
('app1','192.168.1.107'),
('app2','192.168.1.108')
)
def getDBInfo(host,user,password):
c = paramiko.SSHClient()
c.load_system_host_keys()
c.set_missing_host_key_policy(paramiko.AutoAddPolicy())
c.connect(host,22,user,password)
stdin,stdout,stderr = c.exec_command("ps aux |awk '{print $3,$4,$5,$6,$11}' |grep mysql")
info = stdout.read()
c.close()
return info
if __name__=="__main__":
print "server CPU% MEM% VSS RSS COMMAND"
for item in hosts:
info = getDBInfo(item[1],"root","123456")
infoArray = info.split()
print "%s %s %s %s %s %s" %(item[0],infoArray[0],infoArray[1],
infoArray[2],infoArray[3],infoArray[4])
发现通过使用paramiko实现的SSHClient简化了工作,不用expect来做交互式的事情。
而且命令可以执行的很复杂,对于执行结果可以做格式化输出,python很方便地做字符串的处理。
这些连接可以做成一个连接池,之后可以执行其他的命令,可控性和扩展性强多了。
阅读(253) | 评论(0) | 转发(0) |