Python 腳本實(shí)現(xiàn)對(duì) Linux 服務(wù)器的監(jiān)控

      網(wǎng)友投稿 990 2022-05-29

      版本說明

      Linux 服務(wù)器是 Ubuntu 12.10

      Python 版本 是 2.7

      工作原理:基于/proc 文件系統(tǒng)

      Linux 系統(tǒng)為管理員提供了非常好的方法,使其可以在系統(tǒng)運(yùn)行時(shí)更改內(nèi)核,而不需要重新引導(dǎo)內(nèi)核系統(tǒng),這是通過/proc 虛擬文件系統(tǒng)實(shí)現(xiàn)的。/proc 文件虛擬系統(tǒng)是一種內(nèi)核和內(nè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è)置(通過改變內(nèi)核參數(shù))。與其他文件系統(tǒng)不同,/proc 存在于內(nèi)存而不是硬盤中。proc 文件系統(tǒng)提供的信息如下:

      進(jìn)程信息:系統(tǒng)中的任何一個(gè)進(jìn)程,在 proc 的子目錄中都有一個(gè)同名的進(jìn)程 ID,可以找到 cmdline、mem、root、stat、statm,以及 status。某些信息只有超級(jí)用戶可見,例如進(jìn)程根目錄。每一個(gè)單獨(dú)含有現(xiàn)有進(jìn)程信息的進(jìn)程有一些可用的專門鏈接,系統(tǒng)中的任何一個(gè)進(jìn)程都有一個(gè)單獨(dú)的自鏈接指向進(jìn)程信息,其用處就是從進(jìn)程中獲取命令行信息。

      系統(tǒng)信息:如果需要了解整個(gè)系統(tǒng)信息中也可以從/proc/stat 中獲得,其中包括 CPU 占用情況、磁盤空間、內(nèi)存對(duì)換、中斷等。

      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ù)量等。

      表 1 是 /proc 目錄中的主要文件的說明:

      表 1 /proc 目錄中的主要文件的說明

      下面本文的幾個(gè)例子都是使用 Python 腳本讀取/proc 目錄中的主要文件來實(shí)現(xiàn)實(shí)現(xiàn)對(duì) Linux 服務(wù)器的監(jiān)控的 。

      使用 Python 腳本實(shí)現(xiàn)對(duì) Linux 服務(wù)器的監(jiān)控

      對(duì)于 CPU(中央處理器)監(jiān)測(cè)

      腳本 1 名稱 CPU1.py,作用獲取 CPU 的信息。

      清單 1.獲取 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__':

      用 Python 腳本實(shí)現(xiàn)對(duì) Linux 服務(wù)器的監(jiān)控

      CPUinfo = CPUinfo()

      for processor in CPUinfo.keys():

      print(CPUinfo[processor]['model name'])

      簡(jiǎn)單說明一下清單 1,讀取/proc/CPUinfo 中的信息,返回 list,每核心一個(gè) dict。其中 list 是一個(gè)使用方括號(hào)括起來的有序元素集合。List 可以作為以 0 下標(biāo)開始的數(shù)組。Dict 是 Python 的內(nèi)置數(shù)據(jù)類型之一, 它定義了鍵和值之間一對(duì)一的關(guān)系。OrderedDict 是一個(gè)字典子類,可以記住其內(nèi)容增加的順序。常規(guī) dict 并不跟蹤插入順序,迭代處理時(shí)會(huì)根據(jù)鍵在散列表中存儲(chǔ)的順序來生成值。在 OrderedDict 中則相反,它會(huì)記住元素插入的順序,并在創(chuàng)建迭代器時(shí)使用這個(gè)順序。

      可以使用 Python 命令運(yùn)行腳本 CPU1.py 結(jié)果見圖 1

      # Python CPU1.py

      Intel(R) Celeron(R) CPU E3200 ?@ 2.40GHz

      圖 1.運(yùn)行清單 1

      也可以使用 chmod 命令添加權(quán)限收直接運(yùn)行 CPU1.py

      #chmod +x CPU1.py

      # ./CPU1.py

      對(duì)于系統(tǒng)負(fù)載監(jiān)測(cè)

      腳本 2 名稱 CPU2.py,作用獲取系統(tǒng)的負(fù)載信息

      清單 2 獲取系統(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']

      簡(jiǎn)單說明一下清單 2:清單 2 讀取/proc/loadavg 中的信息,import os :Python 中 import 用于導(dǎo)入不同的模塊,包括系統(tǒng)提供和自定義的模塊。其基本形式為:import 模塊名 [as 別名],如果只需要導(dǎo)入模塊中的部分或全部?jī)?nèi)容可以用形式:from 模塊名 import *來導(dǎo)入相應(yīng)的模塊。OS 模塊 os 模塊提供了一個(gè)統(tǒng)一的操作系統(tǒng)接口函數(shù),os 模塊能在不同操作系統(tǒng)平臺(tái)如 nt,posix 中的特定函數(shù)間自動(dòng)切換,從而實(shí)現(xiàn)跨平臺(tái)操作。

      可以使用 Python 命令運(yùn)行腳本 CPU1.py 結(jié)果見圖 2 # Python CPU2.py

      圖 2.運(yùn)行清單 2

      對(duì)于內(nèi)存信息的獲取

      腳本 3 名稱 mem.py,作用是獲取內(nèi)存使用情況信息

      清單 3 獲取內(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']))

      簡(jiǎn)單說明一下清單 3:清單 3 讀取 proc/meminfo 中的信息,Python 字符串的 split 方法是用的頻率還是比較多的。比如我們需要存儲(chǔ)一個(gè)很長(zhǎng)的數(shù)據(jù),并且按照有結(jié)構(gòu)的方法存儲(chǔ),方便以后取數(shù)據(jù)進(jìn)行處理。當(dāng)然可以用 json 的形式。但是也可以把數(shù)據(jù)存儲(chǔ)到一個(gè)字段里面,然后有某種標(biāo)示符來分割。 Python 中的 strip 用于去除字符串的首位字符,最后清單 3 打印出內(nèi)存總數(shù)和空閑數(shù)。

      可以使用 Python 命令運(yùn)行腳本 mem.py 結(jié)果見圖 3。 # Python mem.py

      圖 3.運(yùn)行清單 3

      #!/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'

      簡(jiǎn)單說明一下清單 4:清單 4 讀取/proc/net/dev 中的信息,Python 中文件操作可以通過 open 函數(shù),這的確很像 C 語(yǔ)言中的 fopen。通過 open 函數(shù)獲取一個(gè) file object,然后調(diào)用 read(),write()等方法對(duì)文件進(jìn)行讀寫操作。另外 Python 將文本文件的內(nèi)容讀入可以操作的字符串變量非常容易。文件對(duì)象提供了三個(gè)“讀”方法: read()、readline() 和 readlines()。每種方法可以接受一個(gè)變量以限制每次讀取的數(shù)據(jù)量,但它們通常不使用變量。 .read() 每次讀取整個(gè)文件,它通常用于將文件內(nèi)容放到一個(gè)字符串變量中。然而 .read() 生成文件內(nèi)容最直接的字符串表示,但對(duì)于連續(xù)的面向行的處理,它卻是不必要的,并且如果文件大于可用內(nèi)存,則不可能實(shí)現(xiàn)這種處理。.readline() 和 .readlines() 之間的差異是后者一次讀取整個(gè)文件,象 .read() 一樣。.readlines() 自動(dòng)將文件內(nèi)容分析成一個(gè)行的列表,該列表可以由 Python 的 for … in … 結(jié)構(gòu)進(jìn)行處理。另一方面,.readline() 每次只讀取一行,通常比 .readlines() 慢得多。僅當(dāng)沒有足夠內(nèi)存可以一次讀取整個(gè)文件時(shí),才應(yīng)該使用 .readline()。最后清單 4 打印出網(wǎng)絡(luò)接口的輸入和輸出情況。

      可以使用 Python 命令運(yùn)行腳本 net.py 結(jié)果見圖 4 #Python net.py

      圖 4.運(yùn)行清單 4

      監(jiān)控 Apache 服務(wù)器進(jìn)程的 Python 腳本

      Apache 服務(wù)器進(jìn)程可能會(huì)因?yàn)橄到y(tǒng)各種原因而出現(xiàn)異常退出,導(dǎo)致 Web 服務(wù)暫停。所以筆者寫一個(gè) Python 腳本文件:

      清單 5 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 秒后重新啟動(dòng)"

      time.sleep(3)

      os.system("service apache2 restart")

      except:

      print "Error", sys.exc_info()[1]

      設(shè)置文件權(quán)限為執(zhí)行屬性(使用命令 chmod +x crtrl.py),然后加入到/etc/rc.local 即可,一旦 Apache 服務(wù)器進(jìn)程異常退出,該腳本自動(dòng)檢查并且重啟。 簡(jiǎn)單說明一下清單 5 這個(gè)腳本不是基于/proc 偽文件系統(tǒng)的,是基于 Python 自己提供的一些模塊來實(shí)現(xiàn)的 。這里使用的是 Python 的內(nèi)嵌 time 模板,time 模塊提供各種操作時(shí)間的函數(shù)。

      總結(jié)

      在實(shí)際工作中,Linux 系統(tǒng)管理員可以根據(jù)自己使用的服務(wù)器的具體情況編寫一下簡(jiǎn)單實(shí)用的腳本實(shí)現(xiàn)對(duì) Linux 服務(wù)器的監(jiān)控。本文介紹一下使用 Python 腳本實(shí)現(xiàn)對(duì) Linux 服務(wù)器 CPU 、系統(tǒng)負(fù)載、內(nèi)存和 網(wǎng)絡(luò)使用情況的監(jiān)控腳本的編寫方法

      Linux Python

      版權(quán)聲明:本文內(nèi)容由網(wǎng)絡(luò)用戶投稿,版權(quán)歸原作者所有,本站不擁有其著作權(quán),亦不承擔(dān)相應(yīng)法律責(zé)任。如果您發(fā)現(xiàn)本站中有涉嫌抄襲或描述失實(shí)的內(nèi)容,請(qǐng)聯(lián)系我們jiasou666@gmail.com 處理,核實(shí)后本網(wǎng)站將在24小時(shí)內(nèi)刪除侵權(quán)內(nèi)容。

      上一篇:速度采樣頻率
      下一篇:汽車電子嵌入式開發(fā)系列50篇(四)-一文讀懂OS操作系統(tǒng)
      相關(guān)文章
      亚洲一区二区三区深夜天堂| 亚洲AV无码码潮喷在线观看 | 亚洲第一区精品观看| 欧洲 亚洲 国产图片综合| 亚洲另类激情综合偷自拍| 亚洲精品乱码久久久久久久久久久久 | 亚洲国产综合无码一区| 亚洲熟女少妇一区二区| 亚洲中文字幕不卡无码| 国产精品久久久亚洲| 亚洲精品成人无限看| 亚洲成AV人片在线观看无| 亚洲av无码精品网站| 亚洲人成电影在线天堂| 7777久久亚洲中文字幕蜜桃| 久久久无码精品亚洲日韩蜜臀浪潮| 亚洲∧v久久久无码精品| 亚洲人成网www| 亚洲福利电影一区二区?| 亚洲国产成人九九综合| 亚洲成年网站在线观看| 亚洲欧洲国产综合AV无码久久| 亚洲熟女www一区二区三区| 亚洲国产精品嫩草影院| 国产精品亚洲а∨无码播放不卡 | 国产精品亚洲一区二区无码| 亚洲美女在线国产| 亚洲小说区图片区另类春色| 亚洲AV综合色区无码一区| 亚洲专区在线视频| 亚洲图片激情小说| 亚洲日韩国产二区无码| 亚洲AV无码不卡在线观看下载 | 在线观看亚洲精品福利片| 国产v亚洲v天堂无码网站| 青青草原精品国产亚洲av| 亚洲国产精品日韩在线观看| 亚洲中文无码亚洲人成影院| 亚洲av日韩av欧v在线天堂| 九月丁香婷婷亚洲综合色| 亚洲黄色片免费看|