中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

python和shell如何監控linux服務器

發布時間:2021-06-11 12:31:21 來源:億速云 閱讀:188 作者:小新 欄目:開發技術

小編給大家分享一下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 smtplib
import os
import socket
import fcntl
import struct
import time
import sys
from 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_pid
jvm_heap_arr = get_text_sh(bash_jmap_heap)

# gc統計,采樣時間間隔為250ms,采樣數為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)

# 獲取本機名稱和IP
server_name = socket.getfqdn(socket.gethostname())
# 內網IP
inner_ip = get_ip_address("lo")
# 公網IP
out_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 = "<h3><font color='red'>" + sys.argv[1] + "</font></h3>"
# 郵件正文
mail_context += mail_catalog + "<h4><a name = 'top'>服務器top信息:</a></h4><hr>"

# 處理top信息
for line in top_arr_txt:
  mail_context += "<pre>" + line + "</pre>"

mail_context += "<h4><a name = 'instance'>JVM存活實例10:</a></h4><hr>"

# 處理jvm,并將標簽退換掉
for line in jvm_instance_arr:
  # 并將標簽符號替換成html的符號
  mail_context += "<pre>" + line.replace("<", "&lt;").replace(">", "&gt;") + "</pre>"

mail_context += "<h4><a name = 'gc'>GC情況 采樣時間間隔為250ms,采樣數為4:</a></h4><hr>"

# 處理gc信息
for line in jvm_gc_arr:
  # 并將標簽符號替換成html的符號
  mail_context += "<pre>" + line + "</pre>"

mail_context += "<h4><a name = 'heap'>JVM堆信息:</a></h4><hr>"

# 處理heap信息
for line in jvm_heap_arr:
  # 并將標簽符號替換成html的符號
  mail_context += "<pre>" + line + "</pre>"

mail_context += "<h4><a name = 'thread'>JVM線程快照及鎖情況:</a></h4><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 "發送失敗"

3、crontab定時任務

#開始設置定時任務
crontab -e
#15分鐘執行一次
0,15,30,45 * * * * python /opt/monitor/monitor.py 2>&1
#查看任務
crontab -l

看完了這篇文章,相信你對“python和shell如何監控linux服務器”有了一定的了解,如果想了解更多相關知識,歡迎關注億速云行業資訊頻道,感謝各位的閱讀!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

江永县| 涿州市| 包头市| 华阴市| 基隆市| 甘孜县| 惠州市| 衡南县| 阿拉尔市| 荣昌县| 宜章县| 明溪县| 孝义市| 大英县| 枣庄市| 北碚区| 绍兴市| 屏山县| 宿松县| 南木林县| 托克托县| 桂东县| 旬阳县| 双鸭山市| 大田县| 博罗县| 崇阳县| 始兴县| 平江县| 西华县| 锡林浩特市| 繁峙县| 青龙| 山阳县| 嘉鱼县| 郓城县| 沈阳市| 通渭县| 枞阳县| 工布江达县| 淮滨县|