在线观看www成人影院-在线观看www日本免费网站-在线观看www视频-在线观看操-欧美18在线-欧美1级

0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發帖/加入社區
會員中心
創作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

利用Python寫了一個監控服務器資源利用率的腳本!

jf_yLA7iRus ? 來源:杰哥的IT之旅 ? 2023-01-29 15:08 ? 次閱讀

研究了一個腳本,其主要目的是:基于 Python 編程語言來監控服務器的 CPU、內存、/目錄、/appslog、/bigdata目錄使用率以及網卡接收和發送情況。

該腳本部署場景分為:服務端和客戶端。

服務端:一臺固定 IP 地址的服務器

客戶端:N 臺指定固定 IP 地址的服務器

服務端腳本:

#-*-coding:utf-8-*-
importio
importos
importsys
importlogging
fromloggingimporthandlers
importMySQLdb
importsmtplib
fromemail.mime.textimportMIMEText
fromemail.headerimportHeader
fromemail.utilsimportformataddr
importrequests,json
importdatetime
importtime
importshutil,re
importuuid
importsocket
importSocketServer

ifsys.getdefaultencoding()!='utf-8':
reload(sys)
sys.setdefaultencoding('utf-8')

classLogger(object):
level_relations={
'debug':logging.DEBUG,
'info':logging.INFO,
'warning':logging.WARNING,
'error':logging.ERROR,
'crit':logging.CRITICAL
}#日志級別關系映射

def__init__(self,logname,level='info',when='D',backCount=10,fmt='%(asctime)s-%(pathname)s[line:%(lineno)d]-%(levelname)s:%(message)s'):
CURRENT_DIR=os.path.dirname(__file__)
LOG_FILE=os.path.abspath(os.path.join(CURRENT_DIR,logname))
self.logger=logging.getLogger(LOG_FILE)
format_str=logging.Formatter(fmt)#設置日志格式
self.logger.setLevel(self.level_relations.get(level))#設置日志級別
sh=logging.StreamHandler()#往屏幕上輸出
sh.setFormatter(format_str)#設置屏幕上顯示的格式
th=handlers.TimedRotatingFileHandler(
filename=LOG_FILE,when=when,backupCount=backCount,encoding='utf-8')#往文件里寫入#指定間隔時間自動生成文件的處理器
#實例化TimedRotatingFileHandler
#interval是時間間隔,backupCount是備份文件的個數,如果超過這個個數,就會自動刪除,when是間隔的時間單位,單位有以下幾種:
#S秒
#M分
#H小時、
#D天、
#W每星期(interval==0時代表星期一)
#midnight每天凌晨
th.setFormatter(format_str)#設置文件里寫入的格式
#self.logger.addHandler(sh)#把對象加到logger里
ifnotself.logger.handlers:
self.logger.addHandler(th)

classAnalysis(object):
defbuildMsg(self,msg):
print('構造預警信息'+str(msg))
icount=0
if(float(msg[4])>90):
icount+=1
CPU="> CPU預警:使用率高于90%,使用"+str(msg[4])+"%
"
else:
CPU=""
if(float(msg[5])>90):
icount+=1
mem=">內存預警:使用率高于90%,使用"+str(msg[5])+"%
"
else:
mem=""
if(float(msg[6])>85):
icount+=1
disk_root=">磁盤根目錄預警:使用率高于85%,使用"+str(msg[6])+"%
"
else:
disk_root=""
if(float(msg[7])>85):
icount+=1
disk_appslog=">業務磁盤預警:使用率高于85%,使用"+str(msg[7])+"%
"
else:
disk_appslog=""
if(float(msg[8])>3000):
icount+=1
networkRecv=">網卡10秒內接收數據預警:接收數據大于4000M,接收"+str(msg[8])+"M
"
else:
networkRecv=""
if(float(msg[9])>3000):
icount+=1
networkSend=">網卡10秒內發送數據預警:發送數據大于4000M,發送"+str(msg[9])+"M
"
else:
networkSend=""
s=alarmName+"
"+msg[2]+":"+msg[3]+"
"+CPU+mem+disk_root+disk_appslog+networkRecv+networkSend
#print(s)
log.logger.info('預警信息:'+s)

#發送預警
if(icount>0):
#發送預警郵件、企業微信
ifmailconf==1:
self.send_mail(s,msg[3])
ifwxconf==1:
self.send_WX(s)

defsend_mail(self,content,ip):
smtpserver='smtp.163.com'
mail_user="xxx@163.com"
mail_pass="passwordxxx"
mail_res=["xxx@163.com","xxx@163.com","xxx@163.com","xxx@163.com","xxx@163.com","xxx@163.com","xxx@163.com"]
sub=time.strftime("%Y-%m-%d%H:%M:%S",time.localtime())
msg=MIMEText(sub+"
"+content,_subtype='plain',_charset='utf-8')
msg['Subject']=Header(alarmName+':'+ip,'utf-8')
#msg['From']=Header("系統預警",'utf-8')
msg['From']=formataddr(pair=('設備預警',mail_user))
msg['To']=','.join(mail_res)
smtp=smtplib.SMTP()
smtp.connect(smtpserver)
smtp.starttls()
smtp.login(mail_user,mail_pass)
smtp.sendmail(mail_user,mail_res,msg.as_string())
smtp.quit()

defsend_WX(self,msg):
headers={"Content-Type":"text/plain"}
#s="服務器預警:{},驗證碼{}".format({str(printCode)},{str(verifyCode)})
data={
"msgtype":"text",
"text":{
"content":msg,
}
}
r=requests.post(
url='企業微信機器人地址(需要根據實際機器人地址配置)',
headers=headers,json=data)
print(r.text)

defWrite_to_Mysql_alarm(self,valuelist):
#log=Logger('all.log',level='debug')
#業務監控:id,project,tpye,exceptiontype,details(xx,大數據,無es進程/es集群不健康,)
try:
db=MySQLdb.connect("xxx","xxx","xxx","xxx",charset='utf8')
log.logger.info("數據庫連接成功")
except:
log.logger.info("數據庫連接失敗")
#創建游標
cursor=db.cursor()
uid=uuid.uuid1()
result=0
sql=''
try:
sql='insertintotest_serverresourcealarmvalues(%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s)'
#val=(str(uid),valuelist[1],valuelist[2],valuelist[3],valuelist[4],valuelist[5],valuelist[6],'',valuelist[7],valuelist[8],valuelist[9],valuelist[10],'','','')
val=(str(uid),valuelist[2],valuelist[3],valuelist[4],valuelist[5],valuelist[6],valuelist[7],'',valuelist[8],valuelist[9],valuelist[10],'','','')
cursor.execute(sql,val)
db.commit()
log.logger.error('設備預警信息已入庫!')
#發送企業微信預警信息
self.buildMsg(valuelist)
except:
into=sys.exc_info()
#log.logger.error('插入數據失敗!')
log.logger.error('設備預警信息入庫失敗!'+str(into))
result=0
#str=self.obj_to_string(sys.exc_info(),self)
print('error',into)

#關閉游標
db.close()
returnresult

defWrite_to_Mysql_temp(self,valuelist):
#打開數據庫連接
#db=MySQLdb.connect("xxx","xxx","xxx","xxx",charset='utf8')
try:
db=MySQLdb.connect("xxx","xxx","xxx","xxx",charset='utf8')
log.logger.info("數據庫連接成功")
except:
log.logger.info("數據庫連接失敗")
#使用cursor()方法獲取操作游標
cursor=db.cursor()
uid=uuid.uuid1()
result=0
try:
sql='insertintotest_serverresourcetempvalues(%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s)'
val=(str(uid),valuelist[2],valuelist[3],valuelist[4],valuelist[5],valuelist[6],valuelist[7],'',valuelist[8],valuelist[9],valuelist[10],'','','')
cursor.execute(sql,val)
db.commit()
result=1
log.logger.info("臨時表sql執行狀態:"+str(result))
except:
into=sys.exc_info()
result=0
print(into)
log.logger.info('臨時表sql執行失敗:'+str(into))
#關閉數據庫連接

db.close()
returnresult

classMyServer(SocketServer.BaseRequestHandler):
defhandle(self):
conn=self.request
log.logger.info('...connectedfrom{}'.format(self.client_address))
#print('1多線程監控')
Flag=True
whileFlag:
data=conn.recv(1024)
#print(data)
iflen(data)>10:
log.logger.info('接收到的客戶端數據:'+data)
conn.sendall('1')
sub=data.strip('
')
str=sub.split('|')
#print(str)
a=Analysis()
#報警信息入庫,#將監控數據寫入臨時表中test_serverresourcetemp_lty
result=a.Write_to_Mysql_temp(str)
if(float(str[4])>90orfloat(str[5])>90orfloat(str[6])>85orfloat(str[7])>85orfloat(str[8])>3000orfloat(str[9])>3000):
result1=a.Write_to_Mysql_alarm(str)
#result=1
ifresult==0:
log.logger.info('預警信息入庫失敗!')
else:
log.logger.info('預警信息入庫完成!')
#發送預警郵件、企業微信
#a.buildMsg(str)

ifdata=='exit':
log.logger.info('...connecteend...')
Flag=False

if__name__=="__main__":
#每分鐘執行一次
log=Logger('socketservice.logs')
log.logger.info('----start----')
alarmName='服務器資源預警'
#是否開啟郵件報警,1為開啟,0為關閉
mailconf=1
#是否開啟企業微信報警,1為開啟,0為關閉
wxconf=0
server=SocketServer.ThreadingTCPServer(('IP',port),MyServer)
server.serve_forever()

客戶端腳本:

#-*-coding:utf-8-*-
importio
importos
importsys
importtime
importdatetime
importsocket
importcommands
importlogging
fromloggingimporthandlers
importpsutil
importstruct
importfcntl

ifsys.getdefaultencoding()!='utf-8':
reload(sys)
sys.setdefaultencoding('utf-8')

classLogger(object):
level_relations={
'debug':logging.DEBUG,
'info':logging.INFO,
'warning':logging.WARNING,
'error':logging.ERROR,
'crit':logging.CRITICAL
}#日志級別關系映射

def__init__(self,logname,level='info',when='D',backCount=10,fmt='%(asctime)s-%(pathname)s[line:%(lineno)d]-%(levelname)s:%(message)s'):
CURRENT_DIR=os.path.dirname(__file__)
LOG_FILE=os.path.abspath(os.path.join(CURRENT_DIR,logname))
self.logger=logging.getLogger(LOG_FILE)
format_str=logging.Formatter(fmt)#設置日志格式
self.logger.setLevel(self.level_relations.get(level))#設置日志級別
sh=logging.StreamHandler()#往屏幕上輸出
sh.setFormatter(format_str)#設置屏幕上顯示的格式
th=handlers.TimedRotatingFileHandler(
filename=LOG_FILE,when=when,backupCount=backCount,encoding='utf-8')#往文件里寫入#指定間隔時間自動生成文件的處理器
#實例化TimedRotatingFileHandler
#interval是時間間隔,backupCount是備份文件的個數,如果超過這個個數,就會自動刪除,when是間隔的時間單位,單位有以下幾種:
#S秒
#M分
#H小時、
#D天、
#W每星期(interval==0時代表星期一)
#midnight每天凌晨
th.setFormatter(format_str)#設置文件里寫入的格式
#self.logger.addHandler(sh)#把對象加到logger里
ifnotself.logger.handlers:
self.logger.addHandler(th)

classclientMonitor(object):
#獲取指定網卡ip
defgetIpAddress(self,dev):
s=socket.socket(socket.AF_INET,socket.SOCK_DGRAM)
a=s.fileno()
b=0x8915
c=struct.pack('256s',dev[:15])
res=fcntl.ioctl(a,b,c)[20:24]
returnsocket.inet_ntoa(res)

#獲取網絡的使用情況,取的是eth0的發送和收取的總字節數
#readNetInfo('eth0')
defreadNetInfo(self,dev):
f=open('/proc/net/dev')
lines=f.readlines()
f.close()
res={'in':0,'out':0}
forlineinlines:
ifline.lstrip().startswith(dev):
#forcentos
line=line.replace(':','')
items=line.split()
res['in']=long(items[1])#/1024
res['out']=long(items[len(items)/2+1])#/1024
returnres

defreadNetInfo_new(self,dev):
res={'in':0,'out':0}
res['in']=psutil.net_io_counters(pernic=True).get(dev).bytes_recv
res['out']=psutil.net_io_counters(pernic=True).get(dev).bytes_sent
returnres

#磁盤使用率,path:磁盤路徑
defdisk_stat(self,path):
hd={}
disk=os.statvfs(path)
percent=(disk.f_blocks-disk.f_bfree)*100/(disk.f_blocks-disk.f_bfree+disk.f_bavail)+1
returnpercent

defnet_loop(self,dev):
#end={'in':0,'out':0}
res=self.readNetInfo_new(dev)
#推遲執行的秒數
time.sleep(2)
#new_recv,new_send=get_net_data()
new_res=self.readNetInfo_new(dev)
recv_data=(new_res['in']-res['in'])/1024/1024
send_data=(new_res['out']-res['out'])/1024/1024
print("recv_data:%sM,send_data:%sM"%(recv_data,send_data))
returnrecv_data,send_data

defprocesscheck(self,cmd):
#cmd='ps-aux|sort-k3nr|head-1'
(status,output)=commands.getstatusoutput(cmd)
#Pid=output.split('')[6]
log.logger.info('資源占用top:
'+output)

#查看占用內存最高的進程的PID
#psaux|head-1;psaux|grep-vPID|sort-rn-k+4|head
#ps-aux|sort-k4nr|head-1,-k3cpu占用最高,-k4內存占用最高
#root146681.90.0905043256?Ss4月232811:48/sbin/rngd-f
#索引:-k3 b.split('')[6] 28進程路徑(/sbin/rngd)
#索引:-k4 b.split('')[4]
if__name__=="__main__":
#10分鐘執行一次,數據上報到服務端,服務端負責報警
#需要修改的參數:custom,deviceType,netName
custom='test'
deviceType='客戶端服務器'
#網卡名稱
netName='ens3f0'

log=Logger('socketclient.logs')
log.logger.info("----start----")
info=clientMonitor()

locatIp=info.getIpAddress(netName)
recv_data,send_data=info.net_loop(netName)
cpuinfo=psutil.cpu_percent(1)
#svmem(total=67268558848,available=32022245376,percent=52.4,used=34601009152,free=29655695360,active=17274105856,inactive=2927910912,buffers=10100736,cached=3001753600,shared=298610688,slab=11243315200)
svmem=psutil.virtual_memory()
meminfo=svmem[2]
disk_root=info.disk_stat('/')
disk_appslog=info.disk_stat('/appslog')
disk_bigdata=info.disk_stat('/bigdata')
#如果CPU或內存的占用率大于80%,將占用CPU或內存資源最多的進程找出來
issendmsg=1
if(cpuinfo>80ormeminfo>80ordisk_root>80ordisk_appslog>80ordisk_bigdata>80orrecv_data>3000orsend_data>3000):
#發送預警郵件
sendmsg=locatIp+'服務器資源占用高!請檢查!
'
sendmsg+="CPU占用:"+str(cpuinfo)+'
'
sendmsg+="內存占用:"+str(meminfo)+'
'
sendmsg+="/目錄占用:"+str(disk_root)+'
'
sendmsg+="/appslog目錄占用:"+str(disk_appslog)+'
'
sendmsg+="/bigdata目錄占用:"+str(disk_bigdata)+'
'
sendmsg+="網卡接收流量:"+str(recv_data)+'M,發送流量'+str(send_data)+'M
'
#sendmsg +="網卡10秒發送流量:"+str(send_data)+'
'
log.logger.info(sendmsg)
ifcpuinfo>80:
info.processcheck('ps-aux|sort-k3nr|head-10')
ifmeminfo>80:
info.processcheck('ps-aux|sort-k4nr|head-10')
issendmsg=1
else:
#log.logger.info(locatIp+"正常")
log.logger.info("CPU使用率:"+str(cpuinfo))
log.logger.info("內存使用率:"+str(meminfo))
log.logger.info("/目錄使用率:"+str(disk_root))
log.logger.info("/appslog使用率:"+str(disk_appslog))
log.logger.info("/bigdata使用率:"+str(disk_bigdata))
log.logger.info("網卡接收和發送情況:接收"+str(recv_data)+"M,發送"+str(send_data)+"M")

#Id,custom,deviceType,IP,cpu,mem,disk_root,disk_appslog,disk_bigdata,networkRecv,networkSend,uploadTime,temp2,temp3,temp4
msg='1'+'|'+custom+'|'+deviceType+'|'+locatIp+'|'+str(cpuinfo)+'|'+str(meminfo)+'|'+str(disk_root)+'|'+str(disk_appslog)+'|'+str(disk_bigdata)+'|'+str(recv_data)+'|'+str(send_data)+'|'+time.strftime("%Y-%m-%d%H:%M:%S",time.localtime())

ifissendmsg==1:
ip_port=('IP',port)
sk=socket.socket()
sk.connect(ip_port)
sk.sendall(msg)
data=sk.recv(1024)
ifdata=='1':
log.logger.info("本地預警信息傳輸成功!")
else:
log.logger.info("本地預警信息傳輸失敗!")
sk.sendall('exit')
sk.close()

服務端和客戶端部署好后,執行腳本過程中如遇到缺少 psutil 依賴包的話,則需要進行安裝。

因為我這有準備好的 psutil_rpm 包,可執行命令:rpm -ivh python2-psutil-5.6.7-1.el7.x86_64.rpm

psutil_rpm 包獲取方式:
鏈接:https://pan.baidu.com/s/19iMY8b9nVITtgBq8F3Um_A
提取碼:PsRm

寫個定時任務,以每 2 小時執行一次該腳本。

crontab-e

0*/2***cd/opt/jiaoben;pythontest_socket_resourcemonitor.py

客戶端打印日志效果:

tail-200fsocketclient.logs

b0d41f82-96c6-11ed-bfe3-dac502259ad0.png

審核編輯:湯梓紅
聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。 舉報投訴
  • 服務器
    +關注

    關注

    12

    文章

    9552

    瀏覽量

    86837
  • ip地址
    +關注

    關注

    0

    文章

    305

    瀏覽量

    17362
  • 編程語言
    +關注

    關注

    10

    文章

    1952

    瀏覽量

    35549
  • python
    +關注

    關注

    56

    文章

    4821

    瀏覽量

    85662
  • 腳本
    +關注

    關注

    1

    文章

    395

    瀏覽量

    22248

原文標題:太強了!利用 Python 寫了一個監控服務器資源利用率的腳本!

文章出處:【微信號:釋然IT雜談,微信公眾號:釋然IT雜談】歡迎添加關注!文章轉載請注明出處。

收藏 人收藏

    評論

    相關推薦

    GPU-Z可以監控每個vGPU的總GPU利用率嗎?

    我同時運行4VM,每個vGPU是m60-2Q。所有虛擬機都運行bechmark測試。我使用Techpowerup GPU-Z監控每個vGPU。我發現了有趣的結果。如果我將所有vG
    發表于 09-19 16:59

    Post綜合后的利用率只不過是實施后的利用率

    嗨,Post綜合后的利用率只不過是實施后的利用率......?謝謝娜文G K.
    發表于 05-12 08:57

    如何獲得每個塊的路由資源利用率

    我想知道每個塊使用的詳細路由資源。 “設計路線狀態”僅提供整個設計的網絡總數。有誰知道如何獲得每個塊的路由資源利用率(網絡數量,交換機盒等)?
    發表于 05-21 15:35

    如何獲取棧利用率

    如何獲取棧利用率
    發表于 02-16 07:34

    openEuler 資源利用率提升之道 01:概論

    利用率低于 20%,存在巨大的資源浪費。因此,提升數據中心資源利用率是當前急需解決的重要問
    發表于 07-06 09:54

    openEuler 資源利用率提升之道 04:CPU 搶占和 SMT 隔離控制

    達到較好的效果依賴硬件優先級算法,我們可以期待新的鯤鵬服務器。同時在公有云場景對鄰居干擾的消減也是很重要的,openEuler 在這方法也做了些探索,“潮汐 affinity”技術取得了不俗的效果,也會在后續的文章中與大家見面。下
    發表于 09-22 16:50

    CPU利用率問題求解

    “你能不能實現理想情況下應該在每個時間片開始時執行的監控任務,并確定前一個時間片的利用率。如果利用率
    發表于 12-06 06:00

    活性物質利用率

    活性物質利用率 電池具有活性物質的量與按法拉弟定律計算應產生的電量稱為理論容量。要求電極給出定的電量時,電極的活性物質利用率可表示為
    發表于 11-06 11:02 ?2503次閱讀

    專家談如何提高服務器利用率

    專家談如何提高服務器利用率  如今,數據中心節能已成為熱點話題,為減少功耗,各大廠商紛紛推出相應產品和解決方案。近日,Microsoft的utility
    發表于 01-27 11:46 ?772次閱讀

    關于Swarm和Mesos資源利用率優化實踐分析

    資源調度領域的優秀經驗,以及他們在Mesos社區為提升Mesos資源利用率而正在進行的實踐活動,深度剖析了Mesos資源的收集和調度原理,以及如何在Mesos中提供Revocable
    發表于 10-10 11:54 ?0次下載
    關于Swarm和Mesos<b class='flag-5'>資源</b><b class='flag-5'>利用率</b>優化實踐分析

    cpu利用率異常排查實踐與總結

    昨天下午突然收到運維郵件報警,顯示數據平臺服務器cpu利用率達到了98.94%,而且最近段時間直持續在70%以上,看起來像是硬件資源到瓶
    的頭像 發表于 11-15 15:33 ?3942次閱讀

    監控服務器資源利用率服務腳本

    其主要目的是:基于 Python 編程語言來監控服務器的 CPU、內存、/目錄、/appslog、/bigdata目錄使用率以及網卡接收和發送情況。 該
    的頭像 發表于 01-22 16:02 ?859次閱讀

    openEuler資源利用率提升之道:虛擬機混部介紹與功耗管理技術

    隨著云計算市場規模的快速增長,各云廠商基礎設施投入也不斷增加,但行業普遍存在資源利用率低的問題,在上述背景下,提升資源利用率已經成為了
    的頭像 發表于 01-13 15:10 ?1196次閱讀

    恒訊科技全面解析:如何有效降低服務器CPU利用率

    降低服務器CPU利用率涉及監控、診斷和優化的全面過程。以下是些有效的方法: 1、
    的頭像 發表于 05-10 17:24 ?934次閱讀

    華納云:什么是負載均衡?優化資源利用率的策略

    負載均衡是現代計算機網絡架構中不可或缺的部分,它通過智能分配請求和任務,確保系統資源的高效利用。本文將探討負載均衡的概念、工作原理、優化資源利用率
    的頭像 發表于 10-28 16:07 ?442次閱讀
    主站蜘蛛池模板: 免费爱爱网址 | 三级成人网 | 欧美一级视频免费 | 欧亚色视频 | 日本成人在线网址 | 欧美黄色一级片视频 | 天天射日日射 | 男人和女人做免费做爽爽视频 | 日韩毛片高清在线看 | 嘿嘿嘿视频在线观看网站 | 欧美另类网 | 亚洲深夜 | 日本xxxxx黄区免费看动漫 | 欧美色视频日本 | 7m凹凸精品分类大全免费 | 夜夜爽8888| 国产操比视频 | 黄网址免费 | 成人中文字幕一区二区三区 | 免费啪啪网 | 免费的日本网站 | 午夜国产片 | 狠狠色丁香婷婷综合小时婷婷 | 亚洲三级在线 | 色综合天天综久久久噜噜噜久久〔 | 99久久国产免费中文无字幕 | 日韩三级在线观看视频 | 97视频hd| 看黄视频网站 | 久操免费视频 | 亚洲综合色婷婷在线观看 | 国产情侣露脸 | 天天色影| 亚洲精品久久久久久久蜜桃 | 国产色司机在线视频免费观看 | 久久这里只有精品免费视频 | 国产一级特黄高清在线大片 | 一区二区视频网 | 天天草天天射 | 97影院理论片手机在线观看 | 91大神大战丝袜美女在线观看 |