python和shell監(jiān)控linux服務(wù)器的詳細(xì)代碼
本文實(shí)例為大家分享了python和shell監(jiān)控linux服務(wù)器的具體代碼,供大家參考,具體內(nèi)容如下
1、 shell監(jiān)控負(fù)載
監(jiān)控原理:使用uptime來獲取負(fù)載的信息,然后通過字符串截取的方式來獲取load值來獲取單個(gè)核心的負(fù)載,在將負(fù)載與閾值比較確定是否報(bào)警。
loard_monitor.sh腳本:
#!/bin/bash #使用uptime命令監(jiān)控linux系統(tǒng)負(fù)載變化 #提取本服務(wù)器的IP地址信息 IP=`ifconfig eth0 | grep "inet addr" | cut -f 2 -d ":" | cut -f 1 -d " "` #抓取cpu的總核數(shù) cpu_num=`grep -c 'model name' /proc/cpuinfo` #抓取當(dāng)前系統(tǒng)15分鐘的平均負(fù)載值 load_15=`uptime | awk '{print $NF}'` #計(jì)算當(dāng)前系統(tǒng)單個(gè)核心15分鐘的平均負(fù)載值,結(jié)果小于1.0時(shí)前面?zhèn)€位數(shù)補(bǔ)0。 average_load=`echo "scale=2;a=$load_15/$cpu_num;if(length(a)==scale(a)) print 0;print a" | bc` #取上面平均負(fù)載值的個(gè)位整數(shù) average_int=`echo $average_load | cut -f 1 -d "."` #當(dāng)單個(gè)核心15分鐘的平均負(fù)載值大于等于1.0(即個(gè)位整數(shù)大于0) ,直接發(fā)郵件告警 if (($average_int > 0)); then python /opt/monitor/monitor.py "服務(wù)器15分鐘的系統(tǒng)單個(gè)核心平均負(fù)載為$average_load,超過警戒值1.0,請(qǐng)立即處理?。?!" fi
2、python監(jiān)控,并郵件報(bào)警,同時(shí)記錄JVM等相關(guān)參數(shù)
原理:使用crontab定時(shí)任務(wù)來執(zhí)行python腳本,在腳本中來調(diào)用shell命令或jvm命令獲取信息,最終使用python發(fā)送監(jiān)控郵件。
monitor.py
#!/usr/bin/env Python # coding=utf-8 """ 配合crontab來定時(shí)的讀取服務(wù)器的部分信息 1、top信息 2、JVM實(shí)例信息 3、GC信息 組裝成html發(fā)送郵件 """ import smtplib import os import socket import fcntl import struct import time import sys from email.mime.text import MIMEText # 獲取本機(jī)ip和名稱 def get_ip_address(ifname): s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM) return socket.inet_ntoa(fcntl.ioctl( s.fileno(), 0x8915, # SIOCGIFADDR struct.pack('256s', ifname[:15]) )[20:24]) # 郵件發(fā)動(dòng)方法 def send_mail(to_list, sub, content): # to_list:收件人;sub:主題;content:郵件內(nèi)容 me = mail_title + "<" + mail_user + "@" + mail_postfix + ">" # 這里的hello可以任意設(shè)置,收到信后,將按照設(shè)置顯示 msg = MIMEText(content, _subtype='html', _charset='utf-8') # 創(chuàng)建一個(gè)實(shí)例,這里設(shè)置為html格式郵件 msg['Subject'] = sub # 設(shè)置主題 msg['From'] = me msg['To'] = ";".join(to_list) try: s = smtplib.SMTP() s.connect(mail_host) # 連接smtp服務(wù)器 s.login(mail_user, mail_pass) # 登陸服務(wù)器 s.sendmail(me, to_list, msg.as_string()) # 發(fā)送郵件 s.close() return True except Exception, e: print str(e) return False # 根據(jù)shell命令返回一個(gè)list 文本 def get_text_sh(bash_sh): result = os.popen(bash_sh).read() return result.split("\n") # top信息的獲取 bash_top = "top -bn 1 | head -5 " top_arr_txt = get_text_sh(bash_top) # 服務(wù)器的JVM的pid 并去掉空格 bash_pid = "/usr/local/java/bin/jps | grep 'Bootstrap' | awk '{print $1}'" jvm_pid = os.popen(bash_pid).read().strip() # 獲取JVM中存活得對(duì)象 bash_jmap = "/usr/local/java/bin/jmap -histo:live " + jvm_pid + " | head -13 " jvm_instance_arr = get_text_sh(bash_jmap) # JVM堆信息 bash_jmap_heap = "/usr/local/java/bin/jmap -heap " + jvm_pid jvm_heap_arr = get_text_sh(bash_jmap_heap) # gc統(tǒng)計(jì),采樣時(shí)間間隔為250ms,采樣數(shù)為4 bash_gc = "/usr/local/java/bin/jstat -gc " + jvm_pid + " 250 4 " jvm_gc_arr = get_text_sh(bash_gc) # JVM線程快照 bash_jvm_thread = "jstack -l " + jvm_pid jvm_thread_arr = get_text_sh(bash_jvm_thread) # 獲取本機(jī)名稱和IP server_name = socket.getfqdn(socket.gethostname()) # 內(nèi)網(wǎng)IP inner_ip = get_ip_address("lo") # 公網(wǎng)IP out_ip = get_ip_address("eth0") # 郵件接收者 mailto_list = ["yourname@company.com"] # 設(shè)置服務(wù)器 mail_host = "smtp.xxx.com" # 用戶名 mail_user = "server_monitor" # 動(dòng)態(tài)客戶端口令 mail_pass = "#######" # 發(fā)件箱的后綴 mail_postfix = "163.com" # 標(biāo)題名稱 mail_title = "ServerMonitor" # 標(biāo)題時(shí)間 mail_time = time.strftime("%Y-%m-%d %X", time.localtime(time.time())) # 郵件主題 mail_sub = "【監(jiān)控郵件】服務(wù)器(" + server_name + ")--IP(" + out_ip + ")--時(shí)間(" + mail_time + ")" # 目錄導(dǎo)航 mail_catalog = "<ul>" \ "<li><a href = '#top'>服務(wù)器top信息</a></li>" \ "<li><a href = '#instance'>JVM存活實(shí)例</a></li>" \ "<li><a href = '#gc'>GC情況</a></li>" \ "<li><a href = '#heap'>JVM堆信息</a></li>" \ "<li><a href = '#thread'>JVM線程快照及鎖</a></li>" \ "</ul>" # 報(bào)警內(nèi)容 mail_context = "<h2><font color='red'>" + sys.argv[1] + "</font></h2>" # 郵件正文 mail_context += mail_catalog + "<h3><a name = 'top'>服務(wù)器top信息:</a></h3><hr>" # 處理top信息 for line in top_arr_txt: mail_context += "<pre>" + line + "</pre>" mail_context += "<h3><a name = 'instance'>JVM存活實(shí)例10:</a></h3><hr>" # 處理jvm,并將標(biāo)簽退換掉 for line in jvm_instance_arr: # 并將標(biāo)簽符號(hào)替換成html的符號(hào) mail_context += "<pre>" + line.replace("<", "<").replace(">", ">") + "</pre>" mail_context += "<h3><a name = 'gc'>GC情況 采樣時(shí)間間隔為250ms,采樣數(shù)為4:</a></h3><hr>" # 處理gc信息 for line in jvm_gc_arr: # 并將標(biāo)簽符號(hào)替換成html的符號(hào) mail_context += "<pre>" + line + "</pre>" mail_context += "<h3><a name = 'heap'>JVM堆信息:</a></h3><hr>" # 處理heap信息 for line in jvm_heap_arr: # 并將標(biāo)簽符號(hào)替換成html的符號(hào) mail_context += "<pre>" + line + "</pre>" mail_context += "<h3><a name = 'thread'>JVM線程快照及鎖情況:</a></h3><hr>" # 處理JVM線程快照及鎖情況 for line in jvm_thread_arr: # 并將標(biāo)簽符號(hào)替換成html的符號(hào) mail_context += "<pre>" + line + "</pre>" mail_context += "<pre>線程快照過大,暫時(shí)未提供顯示,如有需要請(qǐng)聯(lián)系<a href = 'yourname'>your</pre>" # 入口 if __name__ == '__main__': if send_mail(mailto_list, mail_sub, mail_context): print "發(fā)送成功" else: print "發(fā)送失敗"
3、crontab定時(shí)任務(wù)
#開始設(shè)置定時(shí)任務(wù) crontab -e #15分鐘執(zhí)行一次 0,15,30,45 * * * * python /opt/monitor/monitor.py 2>&1 #查看任務(wù) crontab -l
以上就是本文的全部內(nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
- 如何把python項(xiàng)目部署到linux服務(wù)器
- Pycharm使用遠(yuǎn)程linux服務(wù)器conda/python環(huán)境在本地運(yùn)行的方法(圖解))
- Linux服務(wù)器上安裝Python3的兩種方式
- python 讀取Linux服務(wù)器上的文件方法
- 詳解Python下ftp上傳文件linux服務(wù)器
- Linux下安裝Python3和django并配置mysql作為django默認(rèn)服務(wù)器方法
- Linux服務(wù)器網(wǎng)卡流量查看方法 shell和Python各一枚
- Linux下將Python的Django項(xiàng)目部署到Apache服務(wù)器
- python下paramiko模塊實(shí)現(xiàn)ssh連接登錄Linux服務(wù)器
- Python?代替?xftp?從?Linux?服務(wù)器下載文件的操作方法
相關(guān)文章
Python函數(shù)中的不定長參數(shù)相關(guān)知識(shí)總結(jié)
今天給大家?guī)淼氖顷P(guān)于Python函數(shù)的相關(guān)知識(shí),文章圍繞著Python不定長參數(shù)展開,文中有非常詳細(xì)的介紹及代碼示例,需要的朋友可以參考下2021-06-06python+selenium爬取微博熱搜存入Mysql的實(shí)現(xiàn)方法
這篇文章主要介紹了python+selenium爬取微博熱搜存入Mysql的實(shí)現(xiàn)方法,本文通過實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2021-01-01Python OpenCV對(duì)圖像像素進(jìn)行操作
大家好,本篇文章主要講的是Python OpenCV對(duì)圖像像素進(jìn)行操作,感興趣的同學(xué)趕快來看一看吧,對(duì)你有幫助的話記得收藏一下,方便下次瀏覽2022-01-01網(wǎng)易2016研發(fā)工程師編程題 獎(jiǎng)學(xué)金(python)
這篇文章主要為大家詳細(xì)介紹了網(wǎng)易2016研發(fā)工程師編程題:獎(jiǎng)學(xué)金(python),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2019-06-063個(gè)Python?SQLAlchemy數(shù)據(jù)庫操作功能詳解
Python?SQLAlchemy?是一個(gè)強(qiáng)大且多功能的?Python?SQL?工具包和對(duì)象關(guān)系映射?(ORM)?系統(tǒng),提供了一整套眾所周知的企業(yè)級(jí)持久性模式,本文為大家整理了它必須了解的3個(gè)數(shù)據(jù)庫操作功能,希望對(duì)大家有所幫助2023-09-09