最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

使用Python腳本對(duì)Linux服務(wù)器進(jìn)行監(jiān)控的教程

 更新時(shí)間:2015年04月02日 16:16:50   作者:曹江華  
這篇文章主要介紹了使用Python程序?qū)inux服務(wù)器進(jìn)行監(jiān)控的教程,主要基于Python2.7的版本,需要的朋友可以參考下

目前 Linux 下有一些使用 Python 語(yǔ)言編寫的 Linux 系統(tǒng)監(jiān)控工具 比如 inotify-sync(文件系統(tǒng)安全監(jiān)控軟件)、glances(資源監(jiān)控工具)在實(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 內(nèi)存 網(wǎng)絡(luò)的監(jiān)控腳本的編寫。
Python 版本說(shuō)明

Python 是由 Guido van Rossum 開(kāi)發(fā)的、可免費(fèi)獲得的、非常高級(jí)的解釋型語(yǔ)言。其語(yǔ)法簡(jiǎn)單易懂,而其面向?qū)ο蟮恼Z(yǔ)義功能強(qiáng)大(但又靈活)。Python 可以廣泛使用并具有高度的可移植性。本文 Linux 服務(wù)器是 Ubuntu 12.10, Python 版本 是 2.7 。如果是 Python 3.0 版本的語(yǔ)法上有一定的出入。另外這里筆者所說(shuō)的 Python 是 CPython,CPython 是用 C 語(yǔ)言實(shí)現(xiàn)的 Python 解釋器,也是官方的并且是最廣泛使用的Python 解釋器。除了 CPython 以外,還有用 Java 實(shí)現(xiàn)的 Jython 和用.NET 實(shí)現(xiàn)的 IronPython,使 Python方便地和 Java 程序、.NET 程序集成。另外還有一些實(shí)驗(yàn)性的 Python 解釋器比如 PyPy。CPython 是使用字節(jié)碼的解釋器,任何程序源代碼在執(zhí)行之前先要編譯成字節(jié)碼。它還有和幾種其它語(yǔ)言(包括 C 語(yǔ)言)交互的外部函數(shù)接口。
工作原理:基于/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)存而不是硬盤中。proc 文件系統(tǒng)提供的信息如下:

  •     進(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)程有一些可用的專門鏈接,系統(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 目錄中的主要文件的說(shuō)明:
表 1 /proc 目錄中的主要文件的說(shuō)明

201542161015347.jpg (624×897)

下面本文的幾個(gè)例子都是使用 Python 腳本讀取/proc 目錄中的主要文件來(lái)實(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__':
  CPUinfo = CPUinfo()
  for processor in CPUinfo.keys():
    print(CPUinfo[processor]['model name'])

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

可以使用 Python 命令運(yùn)行腳本 CPU1.py 結(jié)果見(jiàn)圖 1
 
# Python CPU1.py
Intel(R) Celeron(R) CPU E3200  @ 2.40GHz
圖 1.運(yùn)行清單 1

201542161118803.png (577×140)

也可以使用 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)單說(shuō)明一下清單 2:清單 2 讀取/proc/loadavg 中的信息,import os :Python 中 import 用于導(dǎo)入不同的模塊,包括系統(tǒng)提供和自定義的模塊。其基本形式為:import 模塊名 [as 別名],如果只需要導(dǎo)入模塊中的部分或全部?jī)?nèi)容可以用形式:from 模塊名 import *來(lái)導(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é)果見(jiàn)圖 2 # Python CPU2.py
圖 2.運(yùn)行清單 2

201542161200536.png (536×142)

對(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)單說(shuō)明一下清單 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)示符來(lái)分割。 Python 中的 strip 用于去除字符串的首位字符,最后清單 3 打印出內(nèi)存總數(shù)和空閑數(shù)。

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

201542161224583.png (555×101)

對(duì)于網(wǎng)絡(luò)接口的監(jiān)測(cè)

腳本 4 名稱是 net.py,作用獲取網(wǎng)絡(luò)接口的使用情況。
清單 4 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'

簡(jiǎn)單說(shuō)明一下清單 4:清單 4 讀取/proc/net/dev 中的信息,Python 中文件操作可以通過(guò) open 函數(shù),這的確很像 C 語(yǔ)言中的 fopen。通過(guò) 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)沒(méi)有足夠內(nèi)存可以一次讀取整個(gè)文件時(shí),才應(yīng)該使用 .readline()。最后清單 4 打印出網(wǎng)絡(luò)接口的輸入和輸出情況。

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

201542161257808.png (555×334)

監(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)單說(shuō)明一下清單 5 這個(gè)腳本不是基于/proc 偽文件系統(tǒng)的,是基于 Python 自己提供的一些模塊來(lái)實(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)控腳本的編寫方法。

相關(guān)文章

  • python中numpy矩陣的零填充的示例代碼

    python中numpy矩陣的零填充的示例代碼

    本文主要介紹了python中numpy矩陣的零填充的示例代碼,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2022-08-08
  • 探索Python函數(shù)調(diào)用為何加速代碼執(zhí)行原理

    探索Python函數(shù)調(diào)用為何加速代碼執(zhí)行原理

    Python 作為一種解釋型語(yǔ)言,其執(zhí)行速度相對(duì)于編譯型語(yǔ)言可能會(huì)較慢,然而,在Python中,通常觀察到代碼在函數(shù)中運(yùn)行得更快的現(xiàn)象,這個(gè)現(xiàn)象主要是由于函數(shù)調(diào)用的內(nèi)部?jī)?yōu)化和解釋器的工作方式導(dǎo)致的,本文將深入探討這個(gè)現(xiàn)象,并通過(guò)詳細(xì)的示例代碼進(jìn)行解釋
    2024-01-01
  • django+echart數(shù)據(jù)動(dòng)態(tài)顯示的例子

    django+echart數(shù)據(jù)動(dòng)態(tài)顯示的例子

    今天小編就為大家分享一篇django+echart數(shù)據(jù)動(dòng)態(tài)顯示的例子,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2019-08-08
  • 用python開(kāi)發(fā)一款操作MySQL的小工具

    用python開(kāi)發(fā)一款操作MySQL的小工具

    一個(gè)簡(jiǎn)單的使用python操作mysql的工具,提供了一些類似sql語(yǔ)法的方法,最終拼接成sql??梢院芎玫靥幚硪恍┏R?jiàn)場(chǎng)景,不依賴orm 的同時(shí)避免手寫大量sql
    2021-05-05
  • Python3第三方模塊之Pillow模塊的使用詳解

    Python3第三方模塊之Pillow模塊的使用詳解

    這篇文章主要介紹了Python3第三方模塊之Pillow模塊的使用詳解,在 pillow之前處理圖形的庫(kù)莫過(guò)于PIL,但是它支持到python2.7,年久失修,于是一群志愿者在PIL的基礎(chǔ)上常見(jiàn)了pillow,支持python3,又豐富和功能特性,需要的朋友可以參考下
    2023-10-10
  • Python中Tkinter組件Menu的具體使用

    Python中Tkinter組件Menu的具體使用

    本文主要介紹了Python中Tkinter組件Menu的具體使用,Menu組件用于實(shí)現(xiàn)頂級(jí)菜單、下拉菜單和彈出菜單,文中通過(guò)示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2022-01-01
  • python+pyqt5實(shí)現(xiàn)24點(diǎn)小游戲

    python+pyqt5實(shí)現(xiàn)24點(diǎn)小游戲

    這篇文章主要為大家詳細(xì)介紹了python+pyqt5實(shí)現(xiàn)24點(diǎn)小游戲,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2019-01-01
  • Python matplotlib實(shí)戰(zhàn)之漏斗圖繪制

    Python matplotlib實(shí)戰(zhàn)之漏斗圖繪制

    漏斗圖,形如“漏斗”,用于展示數(shù)據(jù)的逐漸減少或過(guò)濾過(guò)程,這篇文章主要為大家介紹了如何使用Matplotlib繪制漏斗圖,需要的小伙伴可以參考下
    2023-08-08
  • 如何利用pandas將Excel轉(zhuǎn)為html格式

    如何利用pandas將Excel轉(zhuǎn)為html格式

    工作中經(jīng)常會(huì)遇到Excel轉(zhuǎn)為html格式這種需求,下面這篇文章主要給大家介紹了關(guān)于如何利用pandas將Excel轉(zhuǎn)為html格式的相關(guān)資料,主要利用的是pd.to_html,文中通過(guò)示例代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2021-08-08
  • python實(shí)現(xiàn)隨機(jī)調(diào)用一個(gè)瀏覽器打開(kāi)網(wǎng)頁(yè)

    python實(shí)現(xiàn)隨機(jī)調(diào)用一個(gè)瀏覽器打開(kāi)網(wǎng)頁(yè)

    下面小編就為大家分享一篇python實(shí)現(xiàn)隨機(jī)調(diào)用一個(gè)瀏覽器打開(kāi)網(wǎng)頁(yè),具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2018-04-04

最新評(píng)論

商南县| 鹰潭市| 伊宁县| 江口县| 静安区| 茂名市| 黄浦区| 登封市| 祁阳县| 固原市| 乌兰浩特市| 赣榆县| 三门峡市| 甘洛县| 福泉市| 司法| 九台市| 阿拉善右旗| 江口县| 泸州市| 新津县| 钟祥市| 高唐县| 平陆县| 那曲县| 威信县| 弥勒县| 长宁县| 蕲春县| 板桥市| 横峰县| 丹阳市| 区。| 奈曼旗| 米林县| 鹿泉市| 麦盖提县| 嵩明县| 海原县| 汉沽区| 海宁市|