python代替shell完成系统监控的实例分享

发布时间:2020-08-08编辑:脚本学堂
本文介绍下,python与shell相结合,完成linux系统监控的一段代码,有需要的朋友参考下。

linux中,shell/ target=_blank class=infotextkey>shell脚本可用来做系统管理。
shell脚本中调用系统相关命令,用于分析系统负载、运行状况是相当不错的。

不过,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 "yesn";exp_continue}
    "*password:" {send "$passwordn"}
  }
  expect "*#"
  send "monSQLn"
  expect {
    "*mysqldn" {}
    "*#" { send "exitr"}
  }
  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对字符串处理的能力超级棒。
可以将以上所有连接做成一个连接池,之后可以执行其他的命令,提高了可控性与扩展性。

有意研究python的朋友,请前往本站的python编程栏目,那里有丰富的技术文章等着您来参阅。