Python實現(xiàn)Linux監(jiān)控的方法
工作原理:基于/proc 文件系統(tǒng)
Linux 系統(tǒng)為管理員提供了非常好的方法,使其可以在系統(tǒng)運行時更改內(nèi)核,而不需要重新引導(dǎo)內(nèi)核系統(tǒng),這是通過/proc 虛擬文件系統(tǒng)實現(xiàn)的。/proc 文件虛擬系統(tǒng)是一種內(nèi)核和內(nèi)核模塊用來向進(jìn)程(process)發(fā)送信息的機(jī)制(所以叫做“/proc”),這個偽文件系統(tǒng)允許與內(nèi)核內(nèi)部數(shù)據(jù)結(jié)構(gòu)交互,獲取有關(guān)進(jìn)程的有用信息,在運行中(on the fly)改變設(shè)置(通過改變內(nèi)核參數(shù))。與其他文件系統(tǒng)不同,/proc 存在于內(nèi)存而不是硬盤中。proc 文件系統(tǒng)提供的信息如下:
進(jìn)程信息:系統(tǒng)中的任何一個進(jìn)程,在 proc 的子目錄中都有一個同名的進(jìn)程 ID,可以找到 cmdline、mem、root、stat、statm,以及 status。某些信息只有超級用戶可見,例如進(jìn)程根目錄。每一個單獨含有現(xiàn)有進(jìn)程信息的進(jìn)程有一些可用的專門鏈接,系統(tǒng)中的任何一個進(jìn)程都有一個單獨的自鏈接指向進(jìn)程信息,其用處就是從進(jìn)程中獲取命令行信息。
系統(tǒng)信息:如果需要了解整個系統(tǒng)信息中也可以從/proc/stat 中獲得,其中包括 CPU 占用情況、磁盤空間、內(nèi)存對換、中斷等。
CPU 信息:利用/proc/CPUinfo 文件可以獲得中央處理器的當(dāng)前準(zhǔn)確信息。
負(fù)載信息:/proc/loadavg 文件包含系統(tǒng)負(fù)載信息。
系統(tǒng)內(nèi)存信息:/proc/meminfo 文件包含系統(tǒng)內(nèi)存的詳細(xì)信息,其中顯示物理內(nèi)存的數(shù)量、可用交換空間的數(shù)量,以及空閑內(nèi)存的數(shù)量等。
/proc 目錄中的主要文件的說明
- apm 高級電源管理信息
- cmdline 這個文件給出了內(nèi)核啟動的命令行
- CPUinfo 中央處理器信息
- devices 可以用到的設(shè)備(塊設(shè)備/字符設(shè)備)
- dma 顯示當(dāng)前使用的 DMA 通道
- filesystems 核心配置的文件系統(tǒng)
- ioports 當(dāng)前使用的 I/O 端口
- interrupts 這個文件的每一行都有一個保留的中斷
- kcore 系統(tǒng)物理內(nèi)存映像
- kmsg 核心輸出的消息,被送到日志文件
- mdstat 這個文件包含了由 md 設(shè)備驅(qū)動程序控制的 RAID 設(shè)備信息
- loadavg 系統(tǒng)平均負(fù)載均衡
- meminfo 存儲器使用信息,包括物理內(nèi)存和交換內(nèi)存
- modules 這個文件給出可加載內(nèi)核模塊的信息。lsmod 程序用這些信息顯示有關(guān)模塊的名稱,大小,使用數(shù)目方面的信息
- net 網(wǎng)絡(luò)協(xié)議狀態(tài)信息
- partitions 系統(tǒng)識別的分區(qū)表
- pci pci 設(shè)備信息
- scsi scsi 設(shè)備信息
- self 到查看/proc 程序進(jìn)程目錄的符號連接
- stat 這個文件包含的信息有 CPU 利用率,磁盤,內(nèi)存頁,內(nèi)存對換,全部中斷,接觸開關(guān)以及賞賜自舉時間
- swaps 顯示的是交換分區(qū)的使用情況
- uptime 這個文件給出自從上次系統(tǒng)自舉以來的秒數(shù),以及其中有多少秒處于空閑
- version 這個文件只有一行內(nèi)容,說明正在運行的內(nèi)核版本??梢杂脴?biāo)準(zhǔn)的編程方法進(jìn)行分析獲得所需的系統(tǒng)信息
獲取 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'])
簡單說明一下清單 1,讀取/proc/CPUinfo 中的信息,返回 list,每核心一個 dict。其中 list 是一個使用方括號括起來的有序元素集合。List 可以作為以 0 下標(biāo)開始的數(shù)組。Dict 是 Python 的內(nèi)置數(shù)據(jù)類型之一, 它定義了鍵和值之間一對一的關(guān)系。OrderedDict 是一個字典子類,可以記住其內(nèi)容增加的順序。常規(guī) dict 并不跟蹤插入順序,迭代處理時會根據(jù)鍵在散列表中存儲的順序來生成值。在 OrderedDict 中則相反,它會記住元素插入的順序,并在創(chuàng)建迭代器時使用這個順序。
獲取系統(tǒng)的負(fù)載信息
#!/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']
簡單說明一下清單 2:清單 2 讀取/proc/loadavg 中的信息,import os :Python 中 import 用于導(dǎo)入不同的模塊,包括系統(tǒng)提供和自定義的模塊。其基本形式為:import 模塊名 [as 別名],如果只需要導(dǎo)入模塊中的部分或全部內(nèi)容可以用形式:from 模塊名 import *來導(dǎo)入相應(yīng)的模塊。OS 模塊 os 模塊提供了一個統(tǒng)一的操作系統(tǒng)接口函數(shù),os 模塊能在不同操作系統(tǒng)平臺如 nt,posix 中的特定函數(shù)間自動切換,從而實現(xiàn)跨平臺操作。
獲取內(nèi)存使用情況
!/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: {0}'.format(meminfo['MemTotal'])) print('Free memory: {0}'.format(meminfo['MemFree']))
net.py 獲取網(wǎng)絡(luò)接口的輸入和輸出
#!/usr/bin/env Python import time import sys if len(sys.argv) > 1: INTERFACE = sys.argv[1] else: INTERFACE = 'eth0' STATS = [] print 'Interface:',INTERFACE def rx(): ifstat = open('/proc/net/dev').readlines() for interface in ifstat: if INTERFACE in interface: stat = float(interface.split()[1]) STATS[0:] = [stat] def tx(): ifstat = open('/proc/net/dev').readlines() for interface in ifstat: if INTERFACE in interface: stat = float(interface.split()[9]) STATS[1:] = [stat] print 'In Out' rx() tx() while True: 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'
crtrl.py 監(jiān)控 Apache 服務(wù)器進(jìn)程的 Python 腳本
#!/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 秒后重新啟動" time.sleep(3) os.system("service apache2 restart") except: print "Error", sys.exc_info()[1]
總結(jié)
以上所述是小編給大家介紹的Python實現(xiàn)Linux監(jiān)控的方法,希望對大家有所幫助,如果大家有任何疑問歡迎給我留言,小編會及時回復(fù)大家的!
相關(guān)文章
解析pip安裝第三方庫但PyCharm中卻無法識別的問題及PyCharm安裝第三方庫的方法教程
這篇文章主要介紹了解析pip安裝第三方庫但PyCharm中卻無法識別的問題及PyCharm安裝第三方庫的方法教程,本文圖文并茂給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下2020-03-03Windows下安裝python2.7及科學(xué)計算套裝
這篇文章主要向大家介紹的是在windows系統(tǒng)下安裝python 2.7以及numpy安裝、six安裝、dateutil安裝、pyparsing安裝、matplotlib安裝和scipy安裝的方法,分享給大家,需要的小伙伴可以參考下,相對來說,windows下的安裝還是比較簡單的。2015-03-03好用的Python編輯器WingIDE的使用經(jīng)驗總結(jié)
WingIDE是個專為python程序語言設(shè)計的集成開發(fā)環(huán)境。從1999年起,Wingware公司便開始專注于python開發(fā),目前WingIDE已經(jīng)是著名的python開發(fā)框架,面向項目風(fēng)格的 IDE 對于大型產(chǎn)品非常有用, 是個很有前途的開發(fā)環(huán)境。2016-08-08Python3-異步進(jìn)程回調(diào)函數(shù)(callback())介紹
這篇文章主要介紹了Python3-異步進(jìn)程回調(diào)函數(shù)(callback())介紹,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2020-05-05Python 在OpenCV里實現(xiàn)仿射變換—坐標(biāo)變換效果
這篇文章主要介紹了Python 在OpenCV里實現(xiàn)仿射變換—坐標(biāo)變換效果,本文通過一個例子給大家介紹的非常詳細(xì),具有一定的參考借鑒價值,需要的朋友可以參考下2019-08-08Python查找最長不包含重復(fù)字符的子字符串算法示例
這篇文章主要介紹了Python查找最長不包含重復(fù)字符的子字符串算法,涉及Python字符串遍歷、統(tǒng)計相關(guān)操作技巧,需要的朋友可以參考下2019-02-02