使用python進(jìn)行服務(wù)器的監(jiān)控
在linux服務(wù)器中,一切皆為文件,就是說(shuō),服務(wù)器運(yùn)行的個(gè)中信息,其實(shí)是可以從某些文件中查詢得到的;百度后,你會(huì)知道,在Linux系統(tǒng)中,有一個(gè)/proc的虛擬文件系統(tǒng):
Linux 系統(tǒng)為管理員提供了非常好的方法,使其可以在系統(tǒng)運(yùn)行時(shí)更改內(nèi)核,而不需要重新引導(dǎo)內(nèi)核系統(tǒng),這是通過(guò)/proc 虛擬文件系統(tǒng)實(shí)現(xiàn)的。/proc 文件虛擬系統(tǒng)是一種內(nèi)核和內(nèi)核模塊用來(lái)向進(jìn)程(process)發(fā)送信息的機(jī)制(所以叫做“/proc”),這個(gè)偽文件系統(tǒng)允許與內(nèi)核內(nèi)部數(shù)據(jù)結(jié)構(gòu)交互,獲取有關(guān)進(jìn)程的有用信息,在運(yùn)行中(on the fly)改變?cè)O(shè)置(通過(guò)改變內(nèi)核參數(shù))。與其他文件系統(tǒng)不同,/proc 存在于內(nèi)存而不是硬盤(pán)中。proc 文件系統(tǒng)提供的信息如下:
1.進(jìn)程信息:系統(tǒng)中的任何一個(gè)進(jìn)程,在 proc 的子目錄中都有一個(gè)同名的進(jìn)程 ID,可以找到 cmdline、mem、root、stat、statm,以及 status。某些信息只有超級(jí)用戶可見(jiàn),例如進(jìn)程根目錄。每一個(gè)單獨(dú)含有現(xiàn)有進(jìn)程信息的進(jìn)程有一些可用的專(zhuān)門(mén)鏈接,系統(tǒng)中的任何一個(gè)進(jìn)程都有一個(gè)單獨(dú)的自鏈接指向進(jìn)程信息,其用處就是從進(jìn)程中獲取命令行信息。
2.系統(tǒng)信息:如果需要了解整個(gè)系統(tǒng)信息中也可以從/proc/stat 中獲得,其中包括 CPU 占用情況、磁盤(pán)空間、內(nèi)存對(duì)換、中斷等
3.CPU 信息:利用/proc/CPUinfo 文件可以獲得中央處理器的當(dāng)前準(zhǔn)確信息
4.負(fù)載信息:/proc/loadavg 文件包含系統(tǒng)負(fù)載信息
5.系統(tǒng)內(nèi)存信息:/proc/meminfo 文件包含系統(tǒng)內(nèi)存的詳細(xì)信息,其中顯示物理內(nèi)存的數(shù)量、可用交換空間的數(shù)量,以及空閑內(nèi)存的數(shù)量等
/proc 目錄中的主要文件的說(shuō)明
文件或目錄名稱(chēng) | 說(shuō)明 |
---|---|
apm | 高級(jí)電源管理信息 |
cmdline | 這個(gè)文件給出了內(nèi)核啟動(dòng)的命令行 |
CPUinfo | 中央處理器信息 |
devices | 可以用到的設(shè)備(塊設(shè)備/字符設(shè)備) |
dma | 顯示當(dāng)前使用的 DMA 通道 |
filesystems | 核心配置的文件系統(tǒng) |
ioports | 當(dāng)前使用的 I/O 端口 |
interrupts | 這個(gè)文件的每一行都有一個(gè)保留的中斷 |
kcore | 系統(tǒng)物理內(nèi)存映像 |
kmsg | 核心輸出的消息,被送到日志文件 |
mdstat | 這個(gè)文件包含了由 md 設(shè)備驅(qū)動(dòng)程序控制的 RAID 設(shè)備信息 |
loadavg | 系統(tǒng)平均負(fù)載均衡 |
meminfo | 存儲(chǔ)器使用信息,包括物理內(nèi)存和交換內(nèi)存 |
modules | 這個(gè)文件給出可加載內(nèi)核模塊的信息 |
lsmod | 程序用這些信息顯示有關(guān)模塊的名稱(chēng),大小,使用數(shù)目方面的信息 |
net | 網(wǎng)絡(luò)協(xié)議狀態(tài)信息 |
partitions | 系統(tǒng)識(shí)別的分區(qū)表 |
pci | pci 設(shè)備信息 |
scsi | scsi 設(shè)備信息 |
self | 到查看/proc 程序進(jìn)程目錄的符號(hào)連接 |
stat | 這個(gè)文件包含的信息有 CPU 利用率,磁盤(pán),內(nèi)存頁(yè),內(nèi)存對(duì)換,全部 |
swaps | 顯示的是交換分區(qū)的使用情況 |
uptime | 這個(gè)文件給出自從上次系統(tǒng)自舉以來(lái)的秒數(shù),以及其中有多少秒處于空閑 |
version | 這個(gè)文件只有一行內(nèi)容,說(shuō)明正在運(yùn)行的內(nèi)核版本??梢杂脴?biāo)準(zhǔn)的編程方法進(jìn)行分析獲得所需的系統(tǒng)信息 |
以上列出來(lái)了這么多,是不是看起來(lái)眼花繚亂,但是不要慌,其實(shí)我們進(jìn)行服務(wù)器監(jiān)控,只會(huì)經(jīng)常用到其中比較少的以部門(mén)。
利用/proc文件系統(tǒng)進(jìn)行服務(wù)器監(jiān)控
以上我們知道了服務(wù)器信息可以從哪里獲取,那么下面,我們就是編寫(xiě)腳本,讀取我們要獲取信息的文件,從中得到服務(wù)器的運(yùn)行數(shù)據(jù)。下面是我們經(jīng)常會(huì)需要監(jiān)控的服務(wù)器的一些數(shù)據(jù):
讀取/proc/meminfo獲取內(nèi)存信息
該文件內(nèi)容如下
MemTotal: 1017544 kB MemFree: 583304 kB MemAvailable: 756636 kB Buffers: 42996 kB Cached: 238820 kB SwapCached: 0 kB Active: 116092 kB Inactive: 252004 kB Active(anon): 11956 kB Inactive(anon): 85136 kB Active(file): 104136 kB Inactive(file): 166868 kB Unevictable: 0 kB Mlocked: 0 kB SwapTotal: 1044476 kB SwapFree: 1044272 kB Dirty: 64 kB Writeback: 0 kB AnonPages: 86304 kB Mapped: 48832 kB Shmem: 10812 kB Slab: 40648 kB SReclaimable: 29904 kB SUnreclaim: 10744 kB KernelStack: 2048 kB PageTables: 8232 kB NFS_Unstable: 0 kB Bounce: 0 kB WritebackTmp: 0 kB CommitLimit: 1553248 kB Committed_AS: 681428 kB VmallocTotal: 34359738367 kB VmallocUsed: 5796 kB VmallocChunk: 34359727572 kB HardwareCorrupted: 0 kB AnonHugePages: 32768 kB HugePages_Total: 0 HugePages_Free: 0 HugePages_Rsvd: 0 HugePages_Surp: 0 Hugepagesize: 2048 kB DirectMap4k: 34752 kB DirectMap2M: 1013760 kB
每個(gè)字段具體什么意思自己百度吧,直接上監(jiān)控代碼:
""" 內(nèi)存監(jiān)控 """ def memory_stat(): mem = {} f = open('/proc/meminfo', 'r') lines = f.readlines() f.close() for line in lines: if len(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'] #記錄內(nèi)存使用率 已使用 總內(nèi)存和緩存大小 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) return res
讀取/proc/loadavg獲取CPU負(fù)載信息
該文件內(nèi)容如下:
0.00 0.01 0.05 1/128 9424
簡(jiǎn)單說(shuō)明一下每個(gè)字段的含義,前三個(gè)參數(shù)分別為1、5、15分鐘內(nèi)cpu的平均負(fù)載,第四個(gè)參數(shù)為正在運(yùn)行的進(jìn)程數(shù)和總進(jìn)程數(shù),最后一個(gè)代表最近活躍的進(jìn)程ID
下面為python實(shí)現(xiàn)的監(jiān)控CPU負(fù)載的代碼:
""" CPU負(fù)載監(jiān)控 """ def load_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] return loadavg
利用python的os包獲取硬盤(pán)信息
""" 磁盤(pán)空間監(jiān)控 """ def disk_stat(): import os 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)) return res
獲取服務(wù)器的ip
在一個(gè)服務(wù)器上,可能有多塊網(wǎng)卡, 在獲取網(wǎng)卡信息時(shí),你需要傳入網(wǎng)卡的名字,具體有哪些網(wǎng)卡,可以使用ifconfig命令查看
""" 獲取當(dāng)前服務(wù)器ip """ def get_ip(ifname): import socket import fcntl import struct s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM) return socket.inet_ntoa(fcntl.ioctl(s.fileno(), 0x8915, struct.pack('256s', ifname[:15]))[20:24])
讀取/proc/net/dev獲取網(wǎng)卡流量信息
我們將會(huì)從該文件中獲得系統(tǒng)的網(wǎng)絡(luò)接口,以及當(dāng)系統(tǒng)重啟之后通過(guò)它們數(shù)據(jù)發(fā)送和接受數(shù)據(jù)的信息。 /proc/net/dev文件讓這些信息可用。如果你檢查了這個(gè)文件的內(nèi)容,你就會(huì)注意到頭一兩行包含了頭信息等等,這個(gè)文件第一列是網(wǎng)絡(luò)接口名,第二和第三列顯示了接收和發(fā)送的字節(jié)數(shù)信息(例如總發(fā)送字節(jié)數(shù),包數(shù),錯(cuò)誤等等)。這里我們所感興趣的就是他哦難過(guò)不同的網(wǎng)絡(luò)設(shè)備提取出總發(fā)送數(shù)據(jù)和接收數(shù)據(jù)。下面的代碼展示了怎么從/proc/net/dev文件中提取出這些信息,文件內(nèi)容會(huì)是這樣的:
Inter-| Receive | Transmit face |bytes packets errs drop fifo frame compressed multicast|bytes packets errs drop fifo colls carrier compressed lo:13092608592182 4315193859 0 0 0 0 0 0 13092608592182 4315193859 0 0 0 0 0 0 eth0:6081251983019 4697841969 0 0 0 0 0 0 196939978179 2079619999 0 0 0 0 0 0 eth1:5718927608592 9484371630 0 0 0 0 0 0 142737118022 2007173284 0 0 0 0 0 0
下面將獲取每個(gè)網(wǎng)卡的進(jìn)出流量信息:
#!/usr/bin/env python from __future__ import print_function def net_stat(): net = {} f = open("/proc/net/dev") lines = f.readlines() f.close for line in lines[2:]: line = line.split(":") eth_name = line[0].strip() if eth_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 return net if __name__ == '__main__': netdevs = net_stat() print(netdevs)
最后在提供一個(gè)Apache服務(wù)的監(jiān)控腳本
#!/usr/bin/env Python import os, sys, time while True: time.sleep(4) try: ret = os.popen('ps -C apache -o pid,cmd').readlines() if len(ret) < 2: print "apache 進(jìn)程異常退出, 4 秒后重新啟動(dòng)" time.sleep(3) os.system("service apache2 restart") except: print "Error", sys.exc_info()[1]
總結(jié)
以上所述是小編給大家介紹的使用python進(jìn)行服務(wù)器的監(jiān)控,希望對(duì)大家有所幫助,如果大家有任何疑問(wèn)請(qǐng)給我留言,小編會(huì)及時(shí)回復(fù)大家的。在此也非常感謝大家對(duì)腳本之家網(wǎng)站的支持!
- 基于python3監(jiān)控服務(wù)器狀態(tài)進(jìn)行郵件報(bào)警
- python 監(jiān)控服務(wù)器是否有人遠(yuǎn)程登錄(詳細(xì)思路+代碼)
- Python監(jiān)控服務(wù)器實(shí)用工具psutil使用解析
- python3.8 微信發(fā)送服務(wù)器監(jiān)控報(bào)警消息代碼實(shí)現(xiàn)
- 詳解用Python實(shí)現(xiàn)自動(dòng)化監(jiān)控遠(yuǎn)程服務(wù)器
- python腳本監(jiān)控Tomcat服務(wù)器的方法
- python和shell監(jiān)控linux服務(wù)器的詳細(xì)代碼
- 使用Python腳本對(duì)Linux服務(wù)器進(jìn)行監(jiān)控的教程
- linux系統(tǒng)使用python監(jiān)控apache服務(wù)器進(jìn)程腳本分享
- 用python監(jiān)控服務(wù)器的cpu,磁盤(pán)空間,內(nèi)存,超過(guò)郵件報(bào)警
相關(guān)文章
ubuntu系統(tǒng)下Python虛擬環(huán)境的安裝和使用教程
這篇文章主要介紹了ubuntu系統(tǒng)下Python虛擬環(huán)境的安裝和使用教程,本文給大家介紹的非常詳細(xì),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2019-06-06Linux目錄結(jié)構(gòu)以及目錄內(nèi)的主要內(nèi)容詳細(xì)解析
以下是對(duì)Linux下的目錄結(jié)構(gòu)以及目錄內(nèi)的主要內(nèi)容進(jìn)行了詳細(xì)的解析介紹。需要的朋友可以過(guò)來(lái)參考下2013-08-08Linux 2.4中netfilter框架實(shí)現(xiàn)
Linux 2.4中netfilter框架實(shí)現(xiàn)...2006-10-10Linux系統(tǒng)“死機(jī)”時(shí)解決方法
2008-02-02linux入門(mén)教程 第4章 X-Window與漢化
linux入門(mén)教程 第4章 X-Window與漢化...2006-10-10