使用python进行服务器的监控
在linux服务器中,一切皆为文件,就是说,服务器运行的个中信息,其实是可以从某些文件中查询得到的;百度后,你会知道,在Linux系统中,有一个/proc的虚拟文件系统:
Linux系统为管理员提供了非常好的方法,使其可以在系统运行时更改内核,而不需要重新引导内核系统,这是通过/proc虚拟文件系统实现的。/proc文件虚拟系统是一种内核和内核模块用来向进程(process)发送信息的机制(所以叫做“/proc”),这个伪文件系统允许与内核内部数据结构交互,获取有关进程的有用信息,在运行中(onthefly)改变设置(通过改变内核参数)。与其他文件系统不同,/proc存在于内存而不是硬盘中。proc文件系统提供的信息如下:
1.进程信息:系统中的任何一个进程,在proc的子目录中都有一个同名的进程ID,可以找到cmdline、mem、root、stat、statm,以及status。某些信息只有超级用户可见,例如进程根目录。每一个单独含有现有进程信息的进程有一些可用的专门链接,系统中的任何一个进程都有一个单独的自链接指向进程信息,其用处就是从进程中获取命令行信息。
2.系统信息:如果需要了解整个系统信息中也可以从/proc/stat中获得,其中包括CPU占用情况、磁盘空间、内存对换、中断等
3.CPU信息:利用/proc/CPUinfo文件可以获得中央处理器的当前准确信息
4.负载信息:/proc/loadavg文件包含系统负载信息
5.系统内存信息:/proc/meminfo文件包含系统内存的详细信息,其中显示物理内存的数量、可用交换空间的数量,以及空闲内存的数量等
/proc目录中的主要文件的说明
以上列出来了这么多,是不是看起来眼花缭乱,但是不要慌,其实我们进行服务器监控,只会经常用到其中比较少的以部门。
利用/proc文件系统进行服务器监控
以上我们知道了服务器信息可以从哪里获取,那么下面,我们就是编写脚本,读取我们要获取信息的文件,从中得到服务器的运行数据。下面是我们经常会需要监控的服务器的一些数据:
读取/proc/meminfo获取内存信息
该文件内容如下
MemTotal:1017544kB MemFree:583304kB MemAvailable:756636kB Buffers:42996kB Cached:238820kB SwapCached:0kB Active:116092kB Inactive:252004kB Active(anon):11956kB Inactive(anon):85136kB Active(file):104136kB Inactive(file):166868kB Unevictable:0kB Mlocked:0kB SwapTotal:1044476kB SwapFree:1044272kB Dirty:64kB Writeback:0kB AnonPages:86304kB Mapped:48832kB Shmem:10812kB Slab:40648kB SReclaimable:29904kB SUnreclaim:10744kB KernelStack:2048kB PageTables:8232kB NFS_Unstable:0kB Bounce:0kB WritebackTmp:0kB CommitLimit:1553248kB Committed_AS:681428kB VmallocTotal:34359738367kB VmallocUsed:5796kB VmallocChunk:34359727572kB HardwareCorrupted:0kB AnonHugePages:32768kB HugePages_Total:0 HugePages_Free:0 HugePages_Rsvd:0 HugePages_Surp:0 Hugepagesize:2048kB DirectMap4k:34752kB DirectMap2M:1013760kB
每个字段具体什么意思自己百度吧,直接上监控代码:
"""内存监控 """ defmemory_stat(): mem={} f=open('/proc/meminfo','r') lines=f.readlines() f.close() forlineinlines: iflen(line)<2: continue name=line.split(':')[0] var=line.split(':')[1].split()[0] mem[name]=float(var) mem['MemUsed']=mem['MemTotal']-mem['MemFree']-mem['Buffers']-mem['Cached'] #记录内存使用率已使用总内存和缓存大小 res={} res['percent']=int(round(mem['MemUsed']/mem['MemTotal']*100)) res['used']=round(mem['MemUsed']/(1024*1024),2) res['MemTotal']=round(mem['MemTotal']/(1024*1024),2) res['Buffers']=round(mem['Buffers']/(1024*1024),2) returnres
读取/proc/loadavg获取CPU负载信息
该文件内容如下:
0.000.010.051/1289424
简单说明一下每个字段的含义,前三个参数分别为1、5、15分钟内cpu的平均负载,第四个参数为正在运行的进程数和总进程数,最后一个代表最近活跃的进程ID
下面为python实现的监控CPU负载的代码:
"""CPU负载监控 """ defload_stat(): loadavg={} f=open("/proc/loadavg") con=f.read().split() f.close() loadavg['lavg_1']=con[0] loadavg['lavg_5']=con[1] loadavg['lavg_15']=con[2] loadavg['nr']=con[3] prosess_list=loadavg['nr'].split('/') loadavg['running_prosess']=prosess_list[0] loadavg['total_prosess']=prosess_list[1] loadavg['last_pid']=con[4] returnloadavg
利用python的os包获取硬盘信息
"""磁盘空间监控 """ defdisk_stat(): importos hd={} disk=os.statvfs('/') hd['available']=float(disk.f_bsize*disk.f_bavail) hd['capacity']=float(disk.f_bsize*disk.f_blocks) hd['used']=float((disk.f_blocks-disk.f_bfree)*disk.f_frsize) res={} res['used']=round(hd['used']/(1024*1024*1024),2) res['capacity']=round(hd['capacity']/(1024*1024*1024),2) res['available']=res['capacity']-res['used'] res['percent']=int(round(float(res['used'])/res['capacity']*100)) returnres
获取服务器的ip
在一个服务器上,可能有多块网卡,在获取网卡信息时,你需要传入网卡的名字,具体有哪些网卡,可以使用ifconfig命令查看
"""获取当前服务器ip """ defget_ip(ifname): importsocket importfcntl importstruct s=socket.socket(socket.AF_INET,socket.SOCK_DGRAM) returnsocket.inet_ntoa(fcntl.ioctl(s.fileno(),0x8915,struct.pack('256s',ifname[:15]))[20:24])
读取/proc/net/dev获取网卡流量信息
我们将会从该文件中获得系统的网络接口,以及当系统重启之后通过它们数据发送和接受数据的信息。/proc/net/dev文件让这些信息可用。如果你检查了这个文件的内容,你就会注意到头一两行包含了头信息等等,这个文件第一列是网络接口名,第二和第三列显示了接收和发送的字节数信息(例如总发送字节数,包数,错误等等)。这里我们所感兴趣的就是他哦难过不同的网络设备提取出总发送数据和接收数据。下面的代码展示了怎么从/proc/net/dev文件中提取出这些信息,文件内容会是这样的:
Inter-|Receive|Transmit face|bytespacketserrsdropfifoframecompressedmulticast|bytespacketserrsdropfifocollscarriercompressed lo:130926085921824315193859000000130926085921824315193859000000 eth0:608125198301946978419690000001969399781792079619999000000 eth1:571892760859294843716300000001427371180222007173284000000
下面将获取每个网卡的进出流量信息:
#!/usr/bin/envpython from__future__importprint_function defnet_stat(): net={} f=open("/proc/net/dev") lines=f.readlines() f.close forlineinlines[2:]: line=line.split(":") eth_name=line[0].strip() ifeth_name!='lo': net_io={} net_io['receive']=round(float(line[1].split()[0])/(1024.0*1024.0),2) net_io['transmit']=round(float(line[1].split()[8])/(1024.0*1024.0),2) net[eth_name]=net_io returnnet if__name__=='__main__': netdevs=net_stat() print(netdevs)
最后在提供一个Apache服务的监控脚本
#!/usr/bin/envPython importos,sys,time whileTrue: time.sleep(4) try: ret=os.popen('ps-Capache-opid,cmd').readlines() iflen(ret)<2: print"apache进程异常退出,4秒后重新启动" time.sleep(3) os.system("serviceapache2restart") except: print"Error",sys.exc_info()[1]
总结
以上所述是小编给大家介绍的使用python进行服务器的监控,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对毛票票网站的支持!