python高级 笔记 03(系统监控)-案例:CPU超80%自动发邮件

监控系统

查看服务器 系统 的相关信息
时刻监控 系统的运行状态

psutil

python system and process utilities

安装 psutil工具

pip3 install psutil

进入交互模式查看

python3
import psutil

在这里插入图片描述
确认模块已经安装好了

常见功能

获取CPU信息

# 获取 CPU信息

# 获取 CPU的核心数
print(psutil.cpu_count())  # 获取核心数(包括虚拟的核心数)
print(psutil.cpu_count(logical=False))  # 获取物理的核心数

获取内存

# 获取 内存信息
# 获取内存的整体信息(总共多少,用了多少,还剩多少)
print(psutil.virtual_memory())
# svmem(total=17179869184, 总计
# available=8433504256, 平均值
# percent=50.9, 百分比
# used=8180936704, 已使用
# free=2737885184, 空闲的
# active=5628534784, inactive=4447707136, wired=2552401920)

# 获取内存的使用率
print(psutil.virtual_memory().percent)

获取硬盘

# 获取 硬盘信息
# 获取硬盘的分区信息
print(psutil.disk_partitions())
# 获取指定目录的磁盘信息
print(psutil.disk_usage("/"))
# 获取使用率
print(psutil.disk_usage("/").percent)

获取网络

# 获取 网络信息
# 获取收到的数据包数量
print(psutil.net_io_counters().bytes_recv)
# 437827584

# 获取收到的数据包数量
print(psutil.net_io_counters().bytes_sent)
# 86791168

获取开机时间

# 获取开机时间
print(psutil.boot_time())
# 1639410432.0这是一个秒,需要转换为日期
import datetime
print(datetime.datetime.fromtimestamp(psutil.boot_time()).strftime("%Y-%m-%d %H:%M:%S"))
# 2021-12-13 23:47:12

总结

psutil 获取 服务器的硬件信息
获取cpu的信息

cpu核心数: psutil .cpu_count()
cpu使用率: psutil
.cpu_percent(interval=0.5) 得设置刷新频率

获取内存信息

内存的信息:psutil.virtual_memory()
内存的使用率:psutil.virtual_memory().percent)

获取硬盘的信息

硬盘的分区信息:psutil.disk_partitions()
硬盘的指定路径的硬盘信息:psutil.disk_usage("/")
硬盘的使用率:psutil.disk_usage("/").percent

网络数据信息:

收到的字节数:psutil.net_io_counters().bytes_recv
发送的字节数:psutil.net_io_counters().bytes_sent

系统监控基础版

在这里插入图片描述

拼接信息,让其显示格式

功能描述:

在这里插入图片描述

字节/1024----->kb/1024----->mb/1024------->GB
在这里插入图片描述

思路:
导入模块
定义变量,保存cpu信息,内存信息,硬盘信息,网络信息
拼接要显示的字符串(格式化字符串拼接)
保存信息到文件中


# 1. 导入 psutil 模块
import psutil
import datetime

# 2. 定义变量,保存CPU的使用率
cpu_per = psutil.cpu_percent(interval=0.5)
# 3. 定义变量,保存内存的信息
memory_info = psutil.virtual_memory()
# 4. 定义变量,保存硬盘的信息
disk_info = psutil.disk_usage("/")
# 5. 定义变量,保存网络的信息
net_info = psutil.net_io_counters()

# 获取系统当前时间
current_time = datetime.datetime.now().strftime("%F %T")

# 6. 拼接字符串显示
log_str = "|---------------------------|-------------|-----------------|-----------------|--------------------------|\n"
log_str += "|    监控时间               |   CPU使用率   | 内存使用率       |   硬盘使用率       |    网络收发量              |\n"
log_str += "|                          |   (共%d核CPU) | (总计%dG内存)   |   (总计%dG硬盘)  |                           |\n" % (
    psutil.cpu_count(logical=False), memory_info.total / 1024 / 1024 / 1024, disk_info.total / 1024 / 1024 / 1024)
log_str += "|--------------------------|--------------|--------------|--------------------|--------------------------|\n"
log_str += "|    %s   |   %s%%       |   %s%%      |  %s%%            |  收:%s/发:%s  |\n" % (
    current_time, cpu_per, memory_info.percent, disk_info.percent, net_info.bytes_recv, net_info.bytes_sent)
log_str += "|--------------------------|---------------|--------------|--------------------|--------------------------|\n"

print(log_str)

# 7. 保存监控信息到日志文件
f = open("log.txt", 'a')
f.write(log_str)
f.close()
|---------------------------|-------------|-----------------|-----------------|--------------------------|
|    监控时间               |   CPU使用率   | 内存使用率       |   硬盘使用率       |    网络收发量              |
|                          |   (4核CPU) | (总计16G内存)   |   (总计233G硬盘)  |                           |
|--------------------------|--------------|--------------|--------------------|--------------------------|
|    2021-12-14 23:25:58   |   0.0%       |   51.6%      |  75.4%            |:527821824/:93579264  |
|--------------------------|---------------|--------------|--------------------|--------------------------|

升级系统定时监控(增加定时功能)


# 1. 定义函数,实现信息的显示和日志的保存
# 2. 死循环,每隔一段时间显示一次

# 3. 导入 模块

import psutil
import datetime


def linux_monitor(time):
    '''定义函数,实现硬件信息的获取'''

    # 2. 定义变量,保存CPU的使用率
    # 设置每隔time才能获取1次信息
    cpu_per = psutil.cpu_percent(interval=time)
    # 3. 定义变量,保存内存的信息
    memory_info = psutil.virtual_memory()
    # 4. 定义变量,保存硬盘的信息
    disk_info = psutil.disk_usage("/")
    # 5. 定义变量,保存网络的信息
    net_info = psutil.net_io_counters()

    # 获取系统当前时间
    current_time = datetime.datetime.now().strftime("%F %T")

    # 6. 拼接字符串显示
    log_str = "|---------------------------|-------------|-----------------|-----------------|--------------------------|\n"
    log_str += "|    监控时间               |   CPU使用率   | 内存使用率       |   硬盘使用率       |    网络收发量              |\n"
    log_str += "|                          |   (共%d核CPU) | (总计%dG内存)   |   (总计%dG硬盘)  |                           |\n" % (
        psutil.cpu_count(logical=False), memory_info.total / 1024 / 1024 / 1024, disk_info.total / 1024 / 1024 / 1024)
    log_str += "|--------------------------|--------------|--------------|--------------------|--------------------------|\n"
    log_str += "|    %s   |   %s%%       |   %s%%      |  %s%%            |  收:%s/发:%s  |\n" % (
        current_time, cpu_per, memory_info.percent, disk_info.percent, net_info.bytes_recv, net_info.bytes_sent)
    log_str += "|--------------------------|---------------|--------------|--------------------|--------------------------|\n"

    print(log_str)

    # 7. 保存监控信息到日志文件
    f = open("log.txt", 'a')
    f.write(log_str)
    f.close()


def main():
    """程序的入口"""
    while True:
        linux_monitor(5)


if __name__ == '__main__':
    main()

进到终端
找到该文件所在的位置
在这里插入图片描述

总结

数据流:
输入流
输出流
标准的错误输出流
重定向:改变数据的流向。

> 重定向

>> 以追加的方式冲顶先

管道: 一个命令的输出作为另外一个命令的输入去使用。

| 指令1|指令2 但是注意指令1必须有输出

软链接:相当于快捷方式,可以通过软链接修改源文件的内容。

ln -s 源文件 连接文件

硬链接:一个文件有多个名字,通过硬链接修改源文件的内容。

ln 源文件 连接文件

软硬连接区别:
软连接可以指向一个不存在的文件,硬链接不可以。
可以对目录创建软链接,不可以对目录创建硬链接。

删除源文件 对 软件接有影响, 对 硬链接 没有。

文件搜索
文本内部搜索
grep ‘内容’ 文件路径
在这里插入图片描述

计算机搜索文件
find ./ -name 文件名
在这里插入图片描述
find ./ -szie 大小
在这里插入图片描述
归档 和 压缩
归档:
tar -cvf 归档文件名.tar 文件1 文件2 …
解档:
tar -xvf 档案文件名

归档+解压
tar -zcvf 归档文件名.tar.gz 文件1 文件2 …

解压 + 解档
tar -zxvf 解压解档文件名.tar.gz
要是指定目录的话
tar -zxvf 解压档文件名.tar.gz -C 要解压的目录

归档和压缩 zip
压缩
zip
压缩目录 要加参数 -r
zip -r xxx.zip 目录
解压缩
unzip xxx.zip
指定解压目录
指定解压目录为aaa
unzip -d aaa xxx.zip

文件权限
9个字符吗表示
u g o
拥有者 u
组权限 g
其他用户全向 o
所有用户权限 a

每一组可以选的权限:
r w x
可读
可写
可执行
修改权限 chmod
子母法
chmod 用户+具体全向 文件名
数字法
r 4
w 2
x 1
- 0
三维权限数字
第一位:文件拥有者权限
第二位:同组用户权限
第三位:其他用户权限

用户管理
切换用户
临时 sudo 命令
永久
su 用户名 输
入用户名对应密码
sudo -s
输入当前用户的密码

修改密码
passwd 修改当前用户密码
passwd xxx 修改xx用户的密码

exit 没有用户,直接退出终端
多次切换用户,推到上次登陆的用户

who 查看当前系统登陆了哪些用户
-q 统计用户数
-u 显示最后一次操作的时间

关机
shutdown

shutdown 13:00 指定在下午一点关机
shutdown +20 20分钟后关机

重启
reboot

软件安装和卸载
三种安装方式
源代码包安装
deb包安装
apt-get方式

apt-get方式安装软件
配置软件源: 修改 etc/apt/source-list
更新软件源: sudo apt-get update
安装软件: sudo apt-get install 软件包名字
卸载软件: sudo apt-get remove 软件包名字

ssh远程登录
服务器端安装
ssh server
sudo apt-get install openssh-server
通过电脑客户端远程连接服务器
要求 服务器必须有 ssh server
登陆
ssh 服务器用户名@服务器地址
eg:
ssh demo@192.168.150.112

scp远程文件拷贝
文件从
本地 到 服务器 :上传
scp 本地路径 服务器用户@服务器ip:服务器路径
服务器到本地 : 下载
scp 服务器用户名@服务器ip:服务器路径 本地路径

如果操作是目录加参数-r
scp -r
eg:
在这里插入图片描述

vim 编辑器
三种模式:
命令模式
输入模式
末行模式

系统新功能监控
psutil 模块

监控系统信息发送邮件功能

yagmail模块

三句代码实现
安装 pip3 install yagmail

准备两个邮箱
一个是发送邮箱
一个是接受邮箱

发送成功了

# 导入模块
import yagmail
# 使用yagmail的类创建对象(发件人,发件人授权码,发件服务器)
# 发件人:user = @163.com
# 发件人授权码:password = xxx
# 发件服务器: host
ya_obj = yagmail.SMTP(user = 'xxx@163.com',password= 'xxx',host='smtp.163.com')
# 使用yagmail 对象发送邮件(指定收件人,邮件主题,发送内容)
content = '你好'
# send()发送邮件 指定 收件人 邮件主题 发送内容
ya_obj.send('xxxx@outlook.com','测试一下',content)

password 需要登录网页的对应发送邮件的163邮箱
在这里插入图片描述开启POP3 获得
password
在这里插入图片描述

发送成功的结果显示如下:
在这里插入图片描述

让GPU超过80%系统自动发邮件


# 1. 定义函数,实现信息的显示和日志的保存
# 2. 死循环,每隔一段时间显示一次

# 3. 导入 模块

import psutil
import datetime
import yagmail

def linux_monitor(time):
    '''定义函数,实现硬件信息的获取'''

    # 2. 定义变量,保存CPU的使用率
    # 设置每隔time才能获取1次信息
    cpu_per = psutil.cpu_percent(interval=time)
    # 3. 定义变量,保存内存的信息
    memory_info = psutil.virtual_memory()
    # 4. 定义变量,保存硬盘的信息
    disk_info = psutil.disk_usage("/")
    # 5. 定义变量,保存网络的信息
    net_info = psutil.net_io_counters()

    # 获取系统当前时间
    current_time = datetime.datetime.now().strftime("%F %T")

    # 6. 拼接字符串显示
    log_str = "|---------------------------|-------------|-----------------|-----------------|--------------------------|\n"
    log_str += "|    监控时间               |   CPU使用率   | 内存使用率       |   硬盘使用率       |    网络收发量              |\n"
    log_str += "|                          |   (共%d核CPU) | (总计%dG内存)   |   (总计%dG硬盘)  |                           |\n" % (
        psutil.cpu_count(logical=False), memory_info.total / 1024 / 1024 / 1024, disk_info.total / 1024 / 1024 / 1024)
    log_str += "|--------------------------|--------------|--------------|--------------------|--------------------------|\n"
    log_str += "|    %s   |   %s%%       |   %s%%      |  %s%%            |  收:%s/发:%s  |\n" % (
        current_time, cpu_per, memory_info.percent, disk_info.percent, net_info.bytes_recv, net_info.bytes_sent)
    log_str += "|--------------------------|---------------|--------------|--------------------|--------------------------|\n"

    print(log_str)

    # 7. 保存监控信息到日志文件
    f = open("log.txt", 'a')
    f.write(log_str)
    f.close()

    # 判断 内存超过80% CPU的占比就发送
    if cpu_per > 80 or memory_info.percent > 80:
        # 8. 发送邮件
        ya_obj = yagmail.SMTP(user='xxxx@163.com', password='GDxxxxxOUSZQEE', host='smtp.163.com')
        # 使用yagmail 对象发送邮件(指定收件人,邮件主题,发送内容)
        content = log_str
        # send()发送邮件 指定 收件人 邮件主题 发送内容
        ya_obj.send('zxxxxxxxxxx11@outlook.com', '[系统监控报告]', content)


def main():
    """程序的入口"""
    while True:
        # 每隔5s发送一次
        linux_monitor(5)


if __name__ == '__main__':
    main()

思路总结回顾

思路:

  • 导入模块
    import yagmail
  • 创建发件对象 yagmail.SMTP(
    user =‘发件人邮箱’,
    passwrod = ‘邮箱授权码’,
    host = ‘发件服务器’)
  • 发送邮件 obj.send(‘收件人’,'主题,‘内容’)
# 判断 内存超过80% CPU的占比就发送
if cpu_per > 80 or memory_info.percent > 80:
    # 8. 发送邮件
    ya_obj = yagmail.SMTP(user='xxxx@163.com', password='GDxxxxxOUSZQEE', host='smtp.163.com')
    # 使用yagmail 对象发送邮件(指定收件人,邮件主题,发送内容)
    content = log_str
    # send()发送邮件 指定 收件人 邮件主题 发送内容
    ya_obj.send('zxxxxxxxxxx11@outlook.com', '[系统监控报告]', content)
  • 0
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值