本文實例為大家分享了python和shell監控linux服務器的具體代碼,供大家參考,具體內容如下
1、 shell監控負載
監控原理:使用uptime來獲取負載的信息,然后通過字符串截取的方式來獲取load值來獲取單個核心的負載,在將負載與閾值比較確定是否報警。
loard_monitor.sh腳本:
#!/bin/bash#使用uptime命令監控linux系統負載變化#提取本服務器的IP地址信息IP=`ifconfig eth0 | grep "inet addr" | cut -f 2 -d ":" | cut -f 1 -d " "`#抓取cpu的總核數cpu_num=`grep -c 'model name' /proc/cpuinfo`#抓取當前系統15分鐘的平均負載值load_15=`uptime | awk '{print $NF}'`#計算當前系統單個核心15分鐘的平均負載值,結果小于1.0時前面個位數補0。average_load=`echo "scale=2;a=$load_15/$cpu_num;if(length(a)==scale(a)) print 0;print a" | bc`#取上面平均負載值的個位整數average_int=`echo $average_load | cut -f 1 -d "."`#當單個核心15分鐘的平均負載值大于等于1.0(即個位整數大于0) ,直接發郵件告警if (($average_int > 0)); then python /opt/monitor/monitor.py "服務器15分鐘的系統單個核心平均負載為$average_load,超過警戒值1.0,請立即處理?。?!"fi
2、python監控,并郵件報警,同時記錄JVM等相關參數
原理:使用crontab定時任務來執行python腳本,在腳本中來調用shell命令或jvm命令獲取信息,最終使用python發送監控郵件。
monitor.py
#!/usr/bin/env Python# coding=utf-8"""配合crontab來定時的讀取服務器的部分信息1、top信息2、JVM實例信息3、GC信息組裝成html發送郵件"""import smtplibimport osimport socketimport fcntlimport structimport timeimport sysfrom email.mime.text import MIMEText# 獲取本機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])# 郵件發動方法def send_mail(to_list, sub, content): # to_list:收件人;sub:主題;content:郵件內容 me = mail_title + "<" + mail_user + "@" + mail_postfix + ">" # 這里的hello可以任意設置,收到信后,將按照設置顯示 msg = MIMEText(content, _subtype='html', _charset='utf-8') # 創建一個實例,這里設置為html格式郵件 msg['Subject'] = sub # 設置主題 msg['From'] = me msg['To'] = ";".join(to_list) try: s = smtplib.SMTP() s.connect(mail_host) # 連接smtp服務器 s.login(mail_user, mail_pass) # 登陸服務器 s.sendmail(me, to_list, msg.as_string()) # 發送郵件 s.close() return True except Exception, e: print str(e) return False# 根據shell命令返回一個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)# 服務器的JVM的pid 并去掉空格bash_pid = "/usr/local/java/bin/jps | grep 'Bootstrap' | awk '{print $1}'"jvm_pid = os.popen(bash_pid).read().strip()# 獲取JVM中存活得對象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_pidjvm_heap_arr = get_text_sh(bash_jmap_heap)# gc統計,采樣時間間隔為250ms,采樣數為4bash_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_pidjvm_thread_arr = get_text_sh(bash_jvm_thread)# 獲取本機名稱和IPserver_name = socket.getfqdn(socket.gethostname())# 內網IPinner_ip = get_ip_address("lo")# 公網IPout_ip = get_ip_address("eth0")# 郵件接收者mailto_list = ["yourname@company.com"]# 設置服務器mail_host = "smtp.xxx.com"# 用戶名mail_user = "server_monitor"# 動態客戶端口令mail_pass = "#######"# 發件箱的后綴mail_postfix = "163.com"# 標題名稱mail_title = "ServerMonitor"# 標題時間mail_time = time.strftime("%Y-%m-%d %X", time.localtime(time.time()))# 郵件主題mail_sub = "【監控郵件】服務器(" + server_name + ")--IP(" + out_ip + ")--時間(" + mail_time + ")"# 目錄導航mail_catalog = "<ul>" / "<li><a href = '#top'>服務器top信息</a></li>" / "<li><a href = '#instance'>JVM存活實例</a></li>" / "<li><a href = '#gc'>GC情況</a></li>" / "<li><a href = '#heap'>JVM堆信息</a></li>" / "<li><a href = '#thread'>JVM線程快照及鎖</a></li>" / "</ul>"# 報警內容mail_context = "<h2><font color='red'>" + sys.argv[1] + "</font></h2>"# 郵件正文mail_context += mail_catalog + "<h3><a name = 'top'>服務器top信息:</a></h3><hr>"# 處理top信息for line in top_arr_txt: mail_context += "<pre>" + line + "</pre>"mail_context += "<h3><a name = 'instance'>JVM存活實例10:</a></h3><hr>"# 處理jvm,并將標簽退換掉for line in jvm_instance_arr: # 并將標簽符號替換成html的符號 mail_context += "<pre>" + line.replace("<", "<").replace(">", ">") + "</pre>"mail_context += "<h3><a name = 'gc'>GC情況 采樣時間間隔為250ms,采樣數為4:</a></h3><hr>"# 處理gc信息for line in jvm_gc_arr: # 并將標簽符號替換成html的符號 mail_context += "<pre>" + line + "</pre>"mail_context += "<h3><a name = 'heap'>JVM堆信息:</a></h3><hr>"# 處理heap信息for line in jvm_heap_arr: # 并將標簽符號替換成html的符號 mail_context += "<pre>" + line + "</pre>"mail_context += "<h3><a name = 'thread'>JVM線程快照及鎖情況:</a></h3><hr>"# 處理JVM線程快照及鎖情況for line in jvm_thread_arr: # 并將標簽符號替換成html的符號 mail_context += "<pre>" + line + "</pre>"mail_context += "<pre>線程快照過大,暫時未提供顯示,如有需要請聯系<a href = 'yourname'>your</pre>"# 入口if __name__ == '__main__': if send_mail(mailto_list, mail_sub, mail_context): print "發送成功" else: print "發送失敗"
新聞熱點
疑難解答