Chinaunix首页 | 论坛 | 博客
  • 博客访问: 1396155
  • 博文数量: 277
  • 博客积分: 2551
  • 博客等级: 少校
  • 技术积分: 3918
  • 用 户 组: 普通用户
  • 注册时间: 2011-02-21 22:46
文章分类

全部博文(277)

文章存档

2017年(3)

2016年(9)

2015年(65)

2014年(27)

2013年(85)

2012年(61)

2011年(27)

分类: Python/Ruby

2013-01-10 23:34:38

   在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很方便地做字符串的处理。
      这些连接可以做成一个连接池,之后可以执行其他的命令,可控性和扩展性强多了。
      
阅读(4167) | 评论(0) | 转发(2) |
给主人留下些什么吧!~~