最近要获取服务器各种参数,包括cpu、内存、磁盘、型号等信息。试用了Hyperic HQ、Nagios和Snmp,它们功能都挺强大的,但是于需求不是太符,亦或者太heavy。
于是乎想到用python执行shell获取这些信息,python执行shell脚本有以下三种方法:
1. os.system()
os.system('ls')
#返回结果0或者1,不能得到命令的输出
2. os.popen()
output = os.popen('ls')PRint output.read()
#打印出的是命令输出,但是得不到执行的返回值
3. commands.getstatusoutput()
(status, output) = commands.getstatusoutput('ls')
print status, output
#打印出返回值和命令输出
可以根据需要选取其中一种方法,以下是python执行shell获取硬件参数写入MySQL,并定期更新的程序:
1'''2Created on Dec 10, 201434@author: liufei5'''6#coding=utf-87importtime, sched, os, string8fromdatetimeimportdatetime9importMySQLdb1011s =sched.scheduler(time.time,time.sleep)1213defevent_func():14try:15#主机名16name = os.popen("""hostname""").read()17#cpu数目18cpu_num = os.popen("""cat /proc/cpuinfo | grep processor | wc -l""").read()19#内存大小20mem = os.popen("""free | grep Mem | awk '{print $2}'""").read()21#机器品牌22
brand = os.popen("""dmidecode | grep 'Vendor' | head -1 | awk -F: '{print $2}'""").read()23#型号24model = os.popen("""dmidecode | grep 'Product Name' | head -1 | awk -F: '{print $2}'""").read()25#磁盘大小26storage = os.popen("""fdisk -l | grep 'Disk /dev/sd' | awk 'BEGIN{sum=0}{sum=sum+$3}END{print sum}'""").read()27#mac地址28mac = os.popen("""ifconfig -a | grep HWaddr | head -1 | awk '{print $5}'""").read()29303132name = name.replace("\n","").lstrip()33cpu_num = cpu_num.replace("\n","").lstrip()34memory_gb = round(string.atof(mem.replace("\n","").lstrip())/1000.0/1000.0, 1)35
brand = brand.replace("\n","").lstrip()36model = model.replace("\n","").lstrip()37storage_gb = storage.replace("\n","").lstrip()38mac = mac.replace("\n","").lstrip()3940printname41printcpu_num42printmemory_gb43printstorage_gb44print
brand45printmodel46printmac4748conn=MySQLdb.connect(host='xx.xx.xx.xx',user='USERNAME',passwd='PASSWord',db='DBNAME',port=3306)49cur=conn.cursor()50cur.execute('select mac from servers where mac=%s',mac)51data =cur.fetchone()5253ifdataisNone:54value =[name, brand, model, memory_gb, storage_gb, cpu_num, mac, datetime.now(), datetime.now()]55cur.execute("insert into servers(name, brand, model, memory_gb, storage_gb, cpu_num, mac, created_at, updated_at) values(%s, %s, %s, %s, %s, %s, %s, %s, %s)",value)56else:57value1 =[name, brand, model, memory_gb, storage_gb, cpu_num, datetime.now(), mac]58cur.execute("update servers set name=%s,brand=%s,model=%s,memory_gb=%s,storage_gb=%s,cpu_num=%s, updated_at=%s where mac=%s",value1)5960conn.commit()61cur.close()62conn.close()6364exceptMySQLdb.Error,e:65print"Mysql Error %d: %s"% (e.args[0], e.args[1])6667defperform(inc):68s.enter(inc,0,perform,(inc,))69event_func()7071defmymain(inc=10):72s.enter(0,0,perform,(inc,))73s.run()7475if__name__=="__main__":76mymain()