实用工具:实时监控服务器CPU负载状态并邮件通知并启用开机自启

news2024/11/17 1:32:20

 作用:在服务器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.text
    except:
        pass
    try:
        response2 = requests.get('https://myip.ipip.net', timeout=5)
        if response2.text:
            unformat_server_ip = response2.text
            server_ip = unformat_server_ip.split(':')[1]
    except:
        pass
    try:
        response3 = requests.get('https://ddns.oray.com/checkip', timeout=5)
        if response3.text:
            unformat_server_ip = response3.text
            server_ip = unformat_server_ip.split(':')[1]
    except:
        pass
    return server_ip


# 监测CPU负载并发送邮件通知
def monitor_cpu_load():
    # 初始化标志变量
    last_email_sent = None

    while True:
        global cpu_usage
        time.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_usage
    cpu_count = psutil.cpu_count(logical=True)  # cpu逻辑核心数
    server_ip = get_server_ip()  # 获取公网ip
    for 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_email
    message['To'] = receiver_email
    message['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 Process


def func():  # 死循环函数,让cpu满载
    while True:
         pass


if __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.coloradmin.cn/o/1476625.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

多特征变量序列预测(九)基于麻雀优化算法的CEEMDAN-SSA-BiGRU-Attention预测模型

目录 往期精彩内容&#xff1a; 前言 1 多特征变量数据集制作与预处理 1.1 导入数据 1.2 CEEMDAN分解 1.3 数据集制作与预处理 2 麻雀优化算法 2.1 麻雀优化算法介绍 2.2 基于Python的麻雀优化算法实现 2.3 麻雀优化算法-超参数寻优过程 3 基于Pytorch的CEEMDAN SSA…

【问题解决】| conda不显示指示前面的(base)无法在终端激活虚拟环境

1 遇到的问题 就是在安装好conda&#xff0c;配置好环境变量后 可以正常用conda的指令&#xff0c;如创建环境等等 但是不能激活新建的环境&#xff0c;我们知道同时也没有前面的小括号指示当前环境&#xff0c;也没有这个前面的(base) 2 解决方式 有一些方法如&#xff0c…

单片机烧录方式 -- IAP、ISP和ICP

目录 背景 1 什么是ICP 2 什么是ISP 3 什么是IAP 4 总结 背景 对于51单片机&#xff0c;我们使用STC-ISP上位机软件通过串口进行程序的烧写&#xff1b;对于STM32系列单片机&#xff0c;我们既可以通过串口烧写程序&#xff0c;也能通过JLink或是STLink进行程序的烧写&am…

Android Duplicate class 排除重复类

一、起因&#xff1a; 在迭代开发的时候&#xff0c;发现2个ijk很多类重复。但又2个库实现的功能是不一样&#xff0c;目前不能合并。但又想保留2个功能。需要排除其中一个库。 二、报错如何下图&#xff1a; 三、解决方法&#xff1a; 3.1 在terminal 也就是命令行处输入 …

fastAdmin表格列表的功能

更多文章&#xff0c;请关注&#xff1a;fastAdmin后台功能详解 | 夜空中最亮的星 FastAdmin是一款基于ThinkPHP5Bootstrap的极速后台开发框架。优点见开发文档 介绍 - FastAdmin框架文档 - FastAdmin开发文档 在这里上传几张优秀的快速入门图: 一张图解析FastAdmin中的表格列…

学不动系列-eslint

ESLint 介绍在最简单的项目使用eslint,包括eslint的vscode插件的使用&#xff0c;自动化格式代码&#xff0c;自动化修复代码&#xff0c;和webpack&#xff0c;vite的配合使用 单独使用 第一步&#xff1a;构建一个空项目 npm init -y 在根目录新建文件./src/app.js&#…

自学Python第十五天-常用的HTML解析工具:bs4、xpath、re

自学Python第十五天-常用的HTML解析工具&#xff1a;bs4、xpath、re BS4安装和引入开始使用find_all() 方法获取标签find() 方法获取标签select() 方法获取标签&#xff0c;css 选择器从标签中获取数据 XPathxpath 基础xpath 语法规则lxml 模块xpath() 方法 REmatch() 方法sear…

上拉电阻与下拉电阻、电容的作用

上拉电阻与下拉电阻 在单片机电路中&#xff0c;上拉电阻和下拉电阻都是常见的电路元件&#xff0c;它们在数字电路设计中扮演着重要的角色。它们的作用如下&#xff1a; 1. **上拉电阻**&#xff1a; - **作用**&#xff1a;当一个引脚没有外部信号时&#xff0c;上拉电阻…

本届挑战赛季军方案:基于图网络及LLM AGENT的微服务系统异常检测和根因定位方法

aiboco团队荣获本届挑战赛季军。该团队来自亿阳信通。 方案介绍 本届挑战赛采用开放式赛题&#xff0c;基于建行云龙舟运维平台的稳定性工具和多维监控系统&#xff0c;模拟大型的生活服务APP的生产环境&#xff0c;提供端到端的全链路的日志、指标和调用链数据。参赛队伍在组…

92. 递归实现指数型枚举 刷题笔记

思路 dfs 考虑选或者不选每个位置 用0表示未考虑 1表示选 2表示不选 用u表示搜索状态 u>n时 已经搜到底层了 需要输出当前方案 遍历 如果选了则输出 #include<iostream> using namespace std; int n; const int N16; int st[N]; void dfs(int u){ //u来记…

nginx------------缓存功能 (六)

一、http 协议反向代理 &#xff08;一&#xff09;反向代理示例:缓存功能 缓存功能可以加速访问&#xff0c;如果没有缓存关闭后端服务器后&#xff0c;图片将无法访问&#xff0c;缓存功能默认关闭&#xff0c;需要开启。 ​ proxy_cache zone_name | off; 默认off #指明调…

nginx之重写功能 模块指令 防盗链

一 重写功能 rewrite Nginx服务器利用 ngx_http_rewrite_module 模块解析和处理rewrite请求&#xff0c; 此功能依靠 PCRE(perl compatible regular expression)&#xff0c;因此编译之前要安装PCRE库&#xff0c;rewrite是 nginx服务器的重要功能之一&#xff0c;重写功…

【IO流】缓冲流

缓冲流 1. 概述2. 作用3. 字节缓冲流3.1 构造方法3.2 代码示例 4. 字符缓冲流4.1 构造方法4.2 特有方法4.3 代码示例4.3.1 readline()方法示例4.3.2 newline()方法示例 5. 字节缓冲流提高效率的原理6. 注意事项 文章中的部分照片来源于哔站黑马程序员阿伟老师处&#xff0c;仅用…

html2canvas + JsPDF.js 导出pdf分页时的问题

问题描述 前一段时间 实现了html2canvas jspdf.js 导出pdf的功能 项目当时没有测试做完就先搁置 最近项目要上线发现分页时问题 这篇文章记录一下之前的bug import html2canvas from html2canvas; import JsPDF from jspdf export function savePdf(el, title) {html2canva…

Keepalived双机热备——Haproxy搭建web群集

一、认识keepalived keepalived是一个开源的软件&#xff0c;用于实现高可用性和负载均衡。它主要用于在多个服务器之间提供故障转移和负载均衡的功能。keepalived可以监控服务器的状态&#xff0c;并在主服务器发生故障时自动将备份服务器切换为主服务器&#xff0c;以确保服…

2024.2.28 网络

思维导图 整理面试题 1、什么是回调函数 答&#xff1a;将函数作为参数传到另一个函数里面&#xff0c;当那个函数执行完之后&#xff0c;再执行传进去的这个函数。这个过程就叫做回调。 2、结构体和共用体的区别 答&#xff1a;结构体的每个成员都会分配内存&#xff0c;…

快讯|Tubi 更新内容库重新定义自己

在每月一期的 Tubi 快讯中&#xff0c;你将全面及时地获取 Tubi 最新发展动态&#xff0c;欢迎&#x1f31f;星标关注【比图科技】&#xff0c;一起成长变强&#xff01; Tubi 更新内容库&#xff0c;重新定义自己 Tubi 近日宣布为数千万用户免费提供备受观众喜爱、获奖无数的…

anaconda指定目录创建环境无效/环境无法创建到指定位置

已经设置目录到D盘 创建环境时还是分配到C盘 可能是指定位置没有开启读写权限&#xff0c;如我在这里安装到了anaconda文件夹&#xff0c;则打开该文件夹的属性->安全->编辑 allusers下的权限全都打勾

android开发电子书,android基础编程

内存泄漏是什么&#xff1f; 内存泄漏即 ML &#xff08;Memory Leak&#xff09; 指 程序在申请内存后&#xff0c;当该内存不需再使用 但 却无法被释放 & 归还给 程序的现象 内存泄漏有哪些情况&#xff0c;对应的解决方案&#xff1f; 内存泄漏的原因归根到底就是当需…

redis-RedisTemplate.opsForGeo 的geo地理位置及实现附近的人的功能

redis内部使用的是 zset 数据结构存储&#xff0c;如下 import cn.huawei.VideoApplication; import cn.huawei.domain.Jingqu; import cn.huawei.service.JingquService; import org.junit.jupiter.api.Test; import org.springframework.beans.factory.annotation.Autowired…