實用工具:實時監控服務器CPU負載狀態并郵件通知并啟用開機自啟

?作用:在服務器CPU高負載時發送郵件通知

目錄

一、功能代碼

二、配置開機自啟動該監控腳本

1,配置自啟腳本

2,啟動

三、功能測試


一、功能代碼

功能:在CPU負載超過預設置的90%閾值時就發送郵件通知!郵件內容顯示服務器的公網IP、CPU邏輯核心數及每個邏輯核心數的負載詳情

import psutil
import smtplib
from email.mime.text import MIMEText
from email.mime.multipart import MIMEMultipart
import requests
import time# 閾值設置
threshold = 90# 郵件服務器配置
smtp_server = 'smtp.qq.com'
smtp_port = 587  # QQ郵箱的端口號為587
# 發送方郵箱賬號和密碼
sender_email = 'xxxxxxx@qq.com'
sender_password = 'yxamfeswlsnijaie'
# 接收方郵箱地址
receiver_email = 'xxxxx@qq.com'# 全局變量
cpu_usage = None  # 每個邏輯處理器的負載def get_server_ip():server_ip = '未獲取到公網ip'try:response1 = requests.get('https://ip.3322.net/', timeout=5)if response1.text:server_ip = response1.textexcept:passtry:response2 = requests.get('https://myip.ipip.net', timeout=5)if response2.text:unformat_server_ip = response2.textserver_ip = unformat_server_ip.split(':')[1]except:passtry:response3 = requests.get('https://ddns.oray.com/checkip', timeout=5)if response3.text:unformat_server_ip = response3.textserver_ip = unformat_server_ip.split(':')[1]except:passreturn server_ip# 監測CPU負載并發送郵件通知
def monitor_cpu_load():# 初始化標志變量last_email_sent = Nonewhile True:global cpu_usagetime.sleep(3)  # 這里睡眠3秒是因為服務器在重啟開機時的瞬間cpu負載是比較高的,所以并不準確,等待3秒更準確cpu_usage = psutil.cpu_percent(interval=1, percpu=True)  # 每個邏輯處理器的負載if all(usage >= threshold for usage in cpu_usage) and last_email_sent != "high":subject = "CPU負載過高警告"body = '服務器公網IP:{0}\n CPU邏輯核心數:{1}\n CPU每個邏輯核心負載均已超90%,請登錄服務器查看詳情\n CPU核心負載詳情:\n'send_email(subject, body)last_email_sent = "high"elif all(usage < threshold for usage in cpu_usage) and last_email_sent != "normal":subject = "CPU負載恢復正常通知"body = '服務器公網IP:{0}\n CPU邏輯核心數:{1}\n CPU已恢復正常。\n CPU核心負載詳情:\n'send_email(subject, body)last_email_sent = "normal"# 發送郵件通知
def send_email(subject, body):# 創建郵件內容global cpu_usagecpu_count = psutil.cpu_count(logical=True)  # cpu邏輯核心數server_ip = get_server_ip()  # 獲取公網ipfor i in range(cpu_count):body += "\t{%d}%%\n" % (i + 2)body = body.format(server_ip, cpu_count, *cpu_usage)message = MIMEMultipart()message['From'] = sender_emailmessage['To'] = receiver_emailmessage['Subject'] = subject# 添加郵件正文# MIMEText有三個參數第一個為文本內容,第二個 plain 設置文本格式,第三個 utf-8 設置編碼可不填message.attach(MIMEText(body, 'plain'))# 發送郵件try:print("正在發送郵件...")smtp = smtplib.SMTP(smtp_server, smtp_port)smtp.starttls()  # 開啟TLS加密連接smtp.login(sender_email, sender_password)smtp.sendmail(sender_email, receiver_email, message.as_string())print("郵件發送成功!")except smtplib.SMTPException as e:print("郵件發送失敗:", e)finally:print("正在退出")smtp.quit()if __name__ == "__main__":monitor_cpu_load()

sender_email和receiver_email 填寫自己的郵箱地址

sender_password 是登錄QQ郵箱的授權碼

詳情參考:https://itutd.blog.csdn.net/article/details/131810368?spm=1001.2014.3001.5502

二、配置開機自啟動該監控腳本

1,配置自啟腳本

在服務器/usr/lib/systemd/system目錄下創建一個新的.service文件

vi /usr/lib/systemd/system/autorun_python.service

寫入以下內容

[Unit]
Description=python_script - monitor cpu
After=network.target remote-fs.target nss-lookup.target
[Service]
Type=simple
ExecStart=/root/.virtualenvs/qubian/bin/python3 /home/monitor_cpu.py
Restart=always
[Install]
WantedBy=multi-user.target

?修改配置后可能需要運行以下命令重新加載

systemctl daemon-reload

?參數解釋:

  1. [Unit]:這個部分主要用于定義服務單元的基本信息,包括服務的描述和啟動順序等。

    • Description:描述這個服務的作用,通常是一個簡短的描述。
    • After:指定在啟動這個服務之前需要先啟動的其他服務單元。在本例中,指定了在啟動這個服務之前需要先啟動的服務有?network.targetremote-fs.target?和?nss-lookup.target
  2. [Service]:這個部分定義了服務運行時的相關參數。

    • Type:指定服務的類型,有 simple、forking、oneshot、dbus、notify 等類型。在這里,Type=simple?表示這是一個簡單類型的服務。
    • ExecStart:定義服務啟動時執行的命令或腳本。在這個例子中,指定了使用指定的 Python 虛擬環境中的 Python 解釋器執行?/home/monitor_cpu.py?腳本。
    • Restart:指定服務異常退出時的重啟策略,always?表示始終重啟。
  3. [Install]:指定服務的安裝相關信息。

    • WantedBy:指定服務所屬的 target,即服務啟動的目標。在這里,multi-user.target?表示這個服務是為了多用戶模式下運行的。

對于Type參數的值有以下:

  1. Type=forking:表示服務將以分叉(forking)方式運行,即服務會創建一個子進程來運行主要的服務進程。當主進程退出時,服務就會被認為是已經停止。但是,它還支持在主進程退出后,Systemd會等待一段時間,以便子進程可以執行一些清理工作。

  2. Type=simple:它表示這個服務是一個簡單的服務,即它只有一個主進程,當這個主進程退出時,服務就會被認為是已經停止。

  3. Type=oneshot:這種類型的服務是指它只需要在啟動時運行一次。當主進程退出時,服務就會被認為是已經停止。

  4. Type=dbus:這種類型的服務是指它需要一個D-Bus名稱,以便Systemd可以監控它。

  5. Type=notify:這種類型的服務是指它會在主進程準備好接受請求時,發送一個通知給Systemd。當Systemd接收到這個通知時,它就會認為服務已經啟動。

  6. Type=idle:這種類型的服務是指它會在所有其他類型的服務都已經啟動后,才會啟動。

2,啟動
# 設置開機自啟動
systemctl enable autorun_python.service
# 運行服務
systemctl start autorun_python.service
# 查看服務運行狀態 
systemctl status autorun_python.service

?查看服務運行狀態,顯示active(running)正在運行中...

更多相關命令

# 關閉開機自啟
systemctl disable autorun_python.service
# 停止運行服務
systemctl stop autorun_python.service
# 重啟服務
systemctl restart autorun_python.service

三、功能測試

寫一個讓CPU滿載的程序測試上面監控CPU的代碼功能是否能正常工作

from multiprocessing import cpu_count
from multiprocessing import Processdef func():  # 死循環函數,讓cpu滿載while True:passif __name__ == '__main__':p_lst = []  # 定義一個列表core_count = cpu_count()  # CPU核心數for i in range(core_count):p = Process(target=func)  # 子進程調用函數p.start()  # 啟動子進程p_lst.append(p)  # 將所有進程寫入列表中for p in p_lst:p.join()  # 檢測p是否結束,如果沒有結束就阻塞直到結束,否則不阻塞print('結束')

使用htop命令查看cpu的負載狀態

?這時四個核心全被干滿了!

也收到了超負載的郵件通知

當CPU負載恢復正常時也收到了相應的郵件

?

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/716957.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/716957.shtml
英文地址,請注明出處:http://en.pswp.cn/news/716957.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

【Spring連載】使用Spring Data訪問 MongoDB----對象映射之屬性轉換器

【Spring連載】使用Spring Data訪問 MongoDB----對象映射之屬性轉換器 一、聲明式值轉換器二、編程式值轉換器注冊三、MongoCustomConversions配置 雖然基于類型的轉換已經提供了影響目標存儲中某些類型的轉換和表示的方法&#xff0c;但當僅考慮特定類型的某些值或屬性進行轉換…

js中Generator函數詳解

定義&#xff1a; promise是為了解決回調地獄的難題出現的&#xff0c;那么 Generator 就是為了解決異步問題而出現的。 普通函數&#xff0c;如果調用它會立即執行完畢&#xff1b;Generator 函數&#xff0c;它可以暫停&#xff0c;不一定馬上把函數體中的所有代碼執行完畢…

Linux基本指令(下)

目錄 1. less指令 2. head與tail指令 3. find指令 示例 4. grep指令 示例 ?編輯 5. zip/unzip 打包與壓縮 示例 ?編輯 6. tar指令 7. find指令&#xff1a; -name 8. echo指令 9. 時間相關的指令 1.在顯示方面&#xff0c;使用者可以設定欲顯示的格式&#xff…

分布式ID(6):Redis實現分布式ID生成

Redis是一個高性能的鍵值數據庫,它可以用于生成分布式唯一標識符。需要注意的是Redis實現ID可以用,這也是很多公司的選擇。但是在redis服務器宕機的情況下,他也可能會出現重復生成ID的情況。 1 實現原理 利用Redis的原子操作:Redis提供了原子性的INCR和INCRBY命令,可用于…

使用python或AI自動分析數據關聯(簡介)

有一些Python庫可以幫助用戶自動發現數據集中的關聯關系。通常這類方法被稱為關聯分析或關聯規則挖掘&#xff0c;其中最著名的算法是Apriori和FP-Growth。 兩個算法 Apriori算法&#xff1a; 這是一個用于頻繁項集挖掘和關聯規則學習的經典算法。Python中的mlxtend庫提供了一…

【機器學習】有監督學習算法之:K最近鄰

K最近鄰 1、引言2、決策樹2.1 定義2.2 原理2.3 實現方式2.3.1 距離度量2.3.2 K值的選擇 2.4 算法公式2.5 代碼示例 3、總結 1、引言 小屌絲&#xff1a;魚哥&#xff0c; 這么長時間沒更新了&#xff0c;是不是得抓緊時間了。 小魚&#xff1a;最近可都是在忙的呢&#xff0c;…

已解決ResponseEntityException的Spring MVC異常響應實體異常的正確解決方法,親測有效!!!

由于ResponseEntityException并非Spring框架中明確定義的異常類&#xff0c;我推斷這里可能指的是在使用ResponseEntity時遇到的常見異常或錯誤。因此&#xff0c;我將根據這個假設&#xff0c;提供一個解決Spring MVC中與ResponseEntity相關異常的通用方法指南。 目錄 問題分…

線上歷史館藏系統 Java+SpringBoot+Vue+MySQL

??計算機編程指導師 ??個人介紹&#xff1a;自己非常喜歡研究技術問題&#xff01;專業做Java、Python、微信小程序、安卓、大數據、爬蟲、Golang、大屏等實戰項目。 ??實戰項目&#xff1a;有源碼或者技術上的問題歡迎在評論區一起討論交流&#xff01; ?? Java實戰 |…

day09_商品管理訂單管理SpringTaskEcharts

文章目錄 1 商品管理1.1 添加功能1.1.1 需求說明1.1.2 核心概念SPUSKU 1.1.3 加載品牌數據CategoryBrandControllerCategoryBrandServiceCategoryBrandMapperCategoryBrandMapper.xml 1.1.4 加載商品單元數據ProductUnitProductUnitControllerProductUnitServiceProductUnitMap…

詳解java中的Lambda表達式

Lambda表達式的前世今生&#xff08;來歷與概述&#xff09; Lambda表達式的前世------匿名類 以往&#xff0c;使用單一抽象方法的接口被用作函數類型。 它們的實例表示函數&#xff08;functions&#xff09;或行動&#xff08;actions&#xff09;。 自從 JDK 1.1 于 1997…

【MySQL】超詳細-基礎操作

數據庫定義 數據庫是一類軟件&#xff0c;用來管理數據&#xff0c;組織數據&#xff1b; 關系型數據庫MySQL&#xff08;Oracle,SQL Server,SQLite&#xff09;以表格形式組織數據&#xff0c;數據格式要求嚴格&#xff1b;非關系型數據庫Redis&#xff08;MongoDB,HBase&…

數據結構與算法-冒泡排序

引言 在數據結構與算法的世界里&#xff0c;冒泡排序作為基礎排序算法之一&#xff0c;以其直觀易懂的原理和實現方式&#xff0c;為理解更復雜的數據處理邏輯提供了堅實的入門階梯。盡管在實際應用中由于其效率問題不常被用于大規模數據的排序任務&#xff0c;但它對于每一位初…

【C++】set、multiset與map、multimap的使用

目錄 一、關聯式容器二、鍵值對三、樹形結構的關聯式容器3.1 set3.1.1 模板參數列表3.1.2 構造3.1.3 迭代器3.1.4 容量3.1.5 修改操作 3.2 multiset3.3 map3.3.1 模板參數列表3.3.2 構造3.3.3 迭代器3.3.4 容量3.3.5 修改操作3.3.6 operator[] 3.4 multimap 一、關聯式容器 談…

Hololens 2應用開發系列(1)——使用MRTK在Unity中設置混合現實場景并進行程序模擬

Hololens 2應用開發系列&#xff08;1&#xff09;——使用MRTK在Unity中進行程序模擬 一、前言二、創建和設置MR場景三、MRTK輸入模擬的開啟 一、前言 在前面的文章中&#xff0c;我介紹了Hololens 2開發環境搭建和項目生成部署等相關內容&#xff0c;使我們能生成一個簡單Ho…

Redis 之九:Spring Data Redis -- Redis Template 用法

SpringData Redis Spring Data Redis 是 Spring Data 項目的一部分&#xff0c;它為 Java 應用程序提供了一種便捷的方式來與 Redis 數據庫進行交互。 Spring Data Redis 提供了對 Redis 的抽象封裝&#xff0c;使得開發者能夠以面向對象的方式操作 Redis&#xff0c;并簡化了 …

matlab 寫入格式化文本文件

目錄 一、save函數 二、fprintf函數 matlab 寫入文本文件可以使用save和fprintf函數 save輸出結果: fprintf輸出結果: 1.23, 2.34, 3.45 4.56, 5.67, 6.78 7.89, 8.90, 9.01 可以看出fprintf輸出結果更加人性化,符合要求,下面分別介紹。 一、save函數 …

linux系統Jenkins工具介紹

Jenkins概念介紹 Jenkins概念Jenkins目的特性產品發布流程 Jenkins概念 Jenkins是一個功能強大的應用程序&#xff0c;允許持續集成和持續交付項目&#xff0c;無論用的是什么平臺。這是一個免費的源代碼&#xff0c;可以處理任何類型的構建或持續集成。集成Jenkins可以用于一些…

MQL5-MT5連接上國內期貨

主要原因是昨天在學習MACD時發現給的基礎代碼感覺不對&#xff0c;但無法證明&#xff0c;因為MT5接的都是外匯交易&#xff0c;數據和國內的文華啥的全對不上&#xff0c;便找了一些國內接CTP的&#xff0c;直接寫代碼有點麻煩&#xff0c;雖然之前對接過國內CTP的東西&#x…

AI入門筆記(三)

神經網絡是如何工作的 神經網絡又是如何工作的呢&#xff1f;我們用一個例子來解釋。我們看下面這張圖片&#xff0c;我們要識別出這些圖片都是0并不難&#xff0c;要怎么交給計算機&#xff0c;讓計算機和我們得出同樣的結果&#xff1f;難點就在于模式識別的答案不標準&…

十二、Nacos源碼系列:Nacos配置中心原理(四)- RefreshEvent 事件處理

前面文章&#xff0c;我們說到回調監聽器的方法中&#xff0c;主要就是發布了一個RefreshEvent事件&#xff0c;這個事件主要由 SpringCloud 相關類來處理。今天我們繼續分析后續的流程。 RefreshEvent 事件會由 RefreshEventListener 來處理&#xff0c;該 listener 含有一個 …