自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

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

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

目前 Linux 下有一些使用 Python 語言編寫的 Linux 系統(tǒng)監(jiān)控工具 比如 inotify-sync(文件系統(tǒng)安全監(jiān)控軟件)、glances(資源監(jiān)控工具)等,在實際工作中,Linux 系統(tǒng)管理員可以根據(jù)自己使用的服務(wù)器的具體情況編寫一下簡單實用的腳本實現(xiàn)對 Linux 服務(wù)器的監(jiān)控。 本文介紹一下使用 Python 腳本實現(xiàn)對 Linux 服務(wù)器 CPU 內(nèi)存 網(wǎng)絡(luò)的監(jiān)控腳本的編寫。

Python 版本說明

Python 是由 Guido van Rossum 開發(fā)的、可免費獲得的、非常高級的解釋型語言。其語法簡單易懂,而其面向?qū)ο蟮恼Z義功能強大(但又靈活)。Python 可以廣泛使用并具有高度的可移植性。本文 Linux 服務(wù)器是 Ubuntu 12.10, Python 版本 是 2.7 。如果是 Python 3.0 版本的語法上有一定的出入。另外這里筆者所說的 Python 是 CPython,CPython 是用 C 語言實現(xiàn)的 Python 解釋器,也是官方的并且是最廣泛使用的Python 解釋器。除了 CPython 以外,還有用 Java 實現(xiàn)的 Jython 和用.NET 實現(xiàn)的 IronPython,使 Python方便地和 Java 程序、.NET 程序集成。另外還有一些實驗性的 Python 解釋器比如 PyPy。CPython 是使用字節(jié)碼的解釋器,任何程序源代碼在執(zhí)行之前先要編譯成字節(jié)碼。它還有和幾種其它語言(包括 C 語言)交互的外部函數(shù)接口。

工作原理:基于/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ù)量等。

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

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

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

#p#

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

  • 對于 CPU(中央處理器)監(jiān)測

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

清單 1.獲取 CPU 的信息:

  1. #!/usr/bin/env Python  
  2. from __future__ import print_function  
  3. from collections import OrderedDict  
  4. import pprint  
  5. def CPUinfo():  
  6. ''' Return the information in /proc/CPUinfo  
  7. as a dictionary in the following format:  
  8. CPU_info['proc0']={...}  
  9. CPU_info['proc1']={...}  
  10. '''  
  11. CPUinfo=OrderedDict()  
  12. procinfo=OrderedDict()  
  13. nprocs = 0  
  14. with open('/proc/CPUinfo') as f:  
  15. for line in f:  
  16. if not line.strip():  
  17. # end of one processor  
  18. CPUinfo['proc%s' % nprocs] = procinfo  
  19. nprocsnprocsnprocs=nprocs+1  
  20. # Reset  
  21. procinfo=OrderedDict()  
  22. else:  
  23. if len(line.split(':')) == 2:  
  24. procinfo[line.split(':')[0].strip()] = line.split(':')[1].strip()  
  25. else:  
  26. procinfo[line.split(':')[0].strip()] = ''  
  27. return CPUinfo  
  28. if __name__=='__main__':  
  29. CPUinfoCPUinfoCPUinfo = CPUinfo()  
  30. for processor in CPUinfo.keys():  
  31. 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)建迭代器時使用這個順序。

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

  1. # Python CPU1.py  
  2. Intel(R) Celeron(R) CPU E3200  @ 2.40GHz  

圖 1.運行清單 1

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

  1. #chmod +x CPU1.py 
  2. # ./CPU1.py 
  • 對于系統(tǒng)負(fù)載監(jiān)測

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

清單 2 獲取系統(tǒng)的負(fù)載信息:

  1. #!/usr/bin/env Python 
  2. import os 
  3. def load_stat(): 
  4. loadavg = {} 
  5. f = open("/proc/loadavg") 
  6. con = f.read().split() 
  7. f.close() 
  8. loadavg['lavg_1']=con[0] 
  9. loadavg['lavg_5']=con[1] 
  10. loadavg['lavg_15']=con[2] 
  11. loadavg['nr']=con[3] 
  12. loadavg['last_pid']=con[4] 
  13. return loadavg 
  14. 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)跨平臺操作。

可以使用 Python 命令運行腳本 CPU1.py 結(jié)果見圖 2:

  1. # Python CPU2.py 

圖 2.運行清單 2

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

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

清單 3 獲取內(nèi)存使用情況:

  1. #!/usr/bin/env Python 
  2. from __future__ import print_function 
  3. from collections import OrderedDict 
  4. def meminfo(): 
  5. ''' Return the information in /proc/meminfo 
  6. as a dictionary ''' 
  7. meminfo=OrderedDict() 
  8. with open('/proc/meminfo') as f: 
  9. for line in f: 
  10. meminfo[line.split(':')[0]] = line.split(':')[1].strip() 
  11. return meminfo 
  12. if __name__=='__main__': 
  13. #print(meminfo()) 
  14. meminfomeminfo = meminfo() 
  15. print('Total memory: {0}'.format(meminfo['MemTotal'])) 
  16. print('Free memory: {0}'.format(meminfo['MemFree'])) 

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

#p#

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

  1. # Python mem.py 

圖 3.運行清單 3

  • 對于網(wǎng)絡(luò)接口的監(jiān)測

腳本 4 名稱是 net.py,作用獲取網(wǎng)絡(luò)接口的使用情況。

清單 4 net.py 獲取網(wǎng)絡(luò)接口的輸入和輸出:

  1. #!/usr/bin/env Python 
  2. import time 
  3. import sys 
  4. if len(sys.argv) > 1: 
  5. INTERFACE = sys.argv[1] 
  6. else: 
  7. INTERFACE = 'eth0' 
  8. STATS = [] 
  9. print 'Interface:',INTERFACE 
  10. def rx(): 
  11. ifstat = open('/proc/net/dev').readlines() 
  12. for interface in  ifstat: 
  13. if INTERFACE in interface: 
  14. stat = float(interface.split()[1]) 
  15. STATS[0:] = [stat] 
  16. def tx(): 
  17. ifstat = open('/proc/net/dev').readlines() 
  18. for interface in  ifstat: 
  19. if INTERFACE in interface: 
  20. stat = float(interface.split()[9]) 
  21. STATS[1:] = [stat] 
  22. print   'In         Out' 
  23. rx() 
  24. tx() 
  25. while   True: 
  26. time.sleep(1) 
  27. rxstat_o = list(STATS) 
  28. rx() 
  29. tx() 
  30. RX = float(STATS[0]) 
  31. RX_O = rxstat_o[0] 
  32. TX = float(STATS[1]) 
  33. TX_O = rxstat_o[1] 
  34. RX_RATE = round((RX - RX_O)/1024/1024,3) 
  35. TX_RATE = round((TX - TX_O)/1024/1024,3) 
  36. print RX_RATE ,'MB      ',TX_RATE ,'MB' 

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

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

  1. #Python net.py 

圖 4.運行清單 4

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

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

清單 5 crtrl.py 監(jiān)控 Apache 服務(wù)器進(jìn)程的 Python 腳本:

  1. #!/usr/bin/env Python 
  2. import os, sys, time 
  3. while True: 
  4. time.sleep(4) 
  5. try: 
  6. ret = os.popen('ps -C apache -o pid,cmd').readlines() 
  7. if len(ret) < 2: 
  8. print "apache 進(jìn)程異常退出, 4 秒后重新啟動" 
  9. time.sleep(3) 
  10. os.system("service apache2 restart") 
  11. except: 
  12. print "Error", sys.exc_info()[1] 

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

總結(jié)

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

責(zé)任編輯:黃丹 來源: jobbole.com
相關(guān)推薦

2010-12-17 09:22:01

Linux服務(wù)器性能監(jiān)控Munin

2011-03-25 15:01:25

Cacti監(jiān)控Windows

2011-03-31 12:48:04

cactiLinuxWindows

2009-04-28 19:38:02

LinuxSrvRepor遠(yuǎn)程監(jiān)控

2011-04-02 11:12:48

cacti監(jiān)控windows

2009-12-09 10:01:41

ibmdwShell刀片服務(wù)器

2011-03-25 15:24:40

Nagios監(jiān)控

2019-06-13 17:15:30

監(jiān)控Linux服務(wù)器

2020-06-07 11:54:34

Linux服務(wù)器命令

2011-03-22 09:07:13

Nagios監(jiān)控Linux

2010-02-03 10:24:48

監(jiān)控寶監(jiān)控Linux

2018-12-11 10:39:14

Python服務(wù)器微信

2012-05-07 10:08:25

Linux

2019-02-11 10:05:10

監(jiān)控Linux命令

2011-01-21 14:52:37

Sendmail

2017-02-05 16:48:38

LinuxGanglia

2011-04-06 14:24:28

nagios監(jiān)控Linux

2011-04-06 15:05:56

nagios監(jiān)控Linux

2009-06-08 10:30:00

ASP腳本服務(wù)器

2011-08-22 12:25:08

nagios
點贊
收藏

51CTO技術(shù)棧公眾號