Python 腳本實現對 Linux 伺服器的監控
目前 Linux 下有一些使用 Python 語言編寫的 Linux 系統監控工具 比如 inotify-sync(文件系統安全監控軟體)、glances(資源監控工具)在實際工作中,Linux 系統管理員可以根據自己使用的伺服器的具體情況編寫一下簡單實用的腳本實現對 Linux 伺服器的監控。 本文介紹一下使用 Python 腳本實現對 Linux 伺服器 CPU 內存 網路的監控腳本的編寫。
工作原理:基於/proc 文件系統
Linux 系統為管理員提供了非常好的方法,使其可以在系統運行時更改內核,而不需要重新引導內核系統,這是通過/proc 虛擬文件系統實現的。/proc 文件虛擬系統是一種內核和內核模塊用來向進程(process)發送信息的機制(所以叫做「/proc」),這個偽文件系統允許與內核內部數據結構交互,獲取有關進程的有用信息,在運行中(on the fly)改變設置(通過改變內核參數)。與其他文件系統不同,/proc 存在於內存而不是硬碟中。proc 文件系統提供的信息如下:
進程信息:系統中的任何一個進程,在 proc 的子目錄中都有一個同名的進程 ID,可以找到 cmdline、mem、root、stat、statm,以及 status。某些信息只有超級用戶可見,例如進程根目錄。每一個單獨含有現有進程信息的進程有一些可用的專門鏈接,系統中的任何一個進程都有一個單獨的自鏈接指向進程信息,其用處就是從進程中獲取命令行信息。
系統信息:如果需要了解整個系統信息中也可以從/proc/stat 中獲得,其中包括 CPU 佔用情況、磁碟空間、內存對換、中斷等。
CPU 信息:利用/proc/CPUinfo 文件可以獲得中央處理器的當前準確信息。
負載信息:/proc/loadavg 文件包含系統負載信息。
系統內存信息:/proc/meminfo 文件包含系統內存的詳細信息,其中顯示物理內存的數量、可用交換空間的數量,以及空閑內存的數量等。
對於 CPU(中央處理器)監測
腳本 1 名稱 CPU1.py,作用獲取 CPU 的信息
#!/usr/bin/env Python
from __future__ import print_function
from collections import OrderedDict
import pprint
def CPUinfo():
""" Return the information in /proc/CPUinfo
as a dictionary in the following format:
CPU_info["proc0"]={...}
CPU_info["proc1"]={...}
"""
CPUinfo=OrderedDict()
procinfo=OrderedDict()
nprocs = 0
with open("/proc/CPUinfo") as f:
for line in f:
if not line.strip():
# end of one processor
CPUinfo["proc%s" % nprocs] = procinfo
nprocs=nprocs+1
# Reset
procinfo=OrderedDict()
else:
if len(line.split(":")) == 2:
procinfo[line.split(":")[0].strip()] = line.split(":")[1].strip()
else:
procinfo[line.split(":")[0].strip()] = ""
return CPUinfo
if __name__=="__main__":
CPUinfo = CPUinfo()
for processor in CPUinfo.keys():
print(CPUinfo[processor]["model name"])
對於系統負載監測
腳本 2 名稱 CPU2.py,作用獲取系統的負載信息
#!/usr/bin/env Python
import os
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]
loadavg["last_pid"]=con[4]
return loadavg
print "loadavg",load_stat()["lavg_15"]
對於內存信息的獲取
腳本 3 名稱 mem.py,作用是獲取內存使用情況信息
#!/usr/bin/env Python
from __future__ import print_function
from collections import OrderedDict
def meminfo():
""" Return the information in /proc/meminfo
as a dictionary """
meminfo=OrderedDict()
with open("/proc/meminfo") as f:
for line in f:
meminfo[line.split(":")[0]] = line.split(":")[1].strip()
return meminfo
if __name__=="__main__":
#print(meminfo())
meminfo = meminfo()
print("Total memory: ".format(meminfo["MemTotal"]))
print("Free memory: ".format(meminfo["MemFree"]))
對於網路介面的監測
腳本 4 名稱是 net.py,作用獲取網路介面的使用情況。
#!/usr/bin/env Python
import time
import sys
if len(sys.argv) > 1:
INTERFACE = sys.argv[1]
else:
INTERFACE = "eth0"
STATS = []
print "Interface:",INTERFACE
defrx():
ifstat = open("/proc/net/dev").readlines()
for interface in ifstat:
if INTERFACE in interface:
stat = float(interface.split()[1])
STATS[0:] = [stat]
deftx():
ifstat = open("/proc/net/dev").readlines()
for interface in ifstat:
if INTERFACE in interface:
stat = float(interface.split()[9])
STATS[1:] = [stat]
print"InOut"
rx()
tx()
whileTrue:
time.sleep(1)
rxstat_o = list(STATS)
rx()
tx()
RX = float(STATS[0])
RX_O = rxstat_o[0]
TX = float(STATS[1])
TX_O = rxstat_o[1]
RX_RATE = round((RX - RX_O)/1024/1024,3)
TX_RATE = round((TX - TX_O)/1024/1024,3)
print RX_RATE ,"MB",TX_RATE ,"MB"
總結
在實際工作中,Linux 系統管理員可以根據自己使用的伺服器的具體情況編寫一下簡單實用的腳本實現對 Linux 伺服器的監控。本文介紹一下使用 Python 腳本實現對 Linux 伺服器 CPU 、系統負載、內存和 網路使用情況的監控腳本的編寫方法。
※一小時學會開發一套學員管理系統demo
※聽說這些「坑」百分之九十的Python開發者都掉進來過!那你呢?
TAG:Python |