首页 > 其他分享 >开发老大周五叫我过去提需求,我崩溃了

开发老大周五叫我过去提需求,我崩溃了

时间:2023-11-11 13:34:21浏览次数:31  
标签:logging 老大 python smtp 周五 ssh import 崩溃 logger

开发老大周五叫我过去提需求,我崩溃了:scream:

临近周五,心情那是一个美滋滋。结果下午开发老大就来找我了,叫我去他工位一趟,我心想:‘凉凉,这估计是来需求了'

果然,需求是这样的:

现在有个系统因为某种原因会导致数据库磁盘数据占满的情况,然后导致数据不能再存储的情况,最后导致系统

崩溃。之前已经发生过这种情况,所以老大写了一个监控job,定时去查询数据库存储是否满,满了就停止系统

提供服务,就是所谓的关闭服务。

但是这样并不能完全解决问题,只是把系统服务停了。老大的意思让我时不时去查看一下数据库的储存情况,如

果占据储存马上要满了,就通知他。

我直接当场就反驳:anguished::“这不能写个脚本看吗,看到磁盘使用率超过多少的时候,发送邮件?”

开发老大:“机器都是内网的,因为安全因素,不能联网”

我想:sob::“那就麻烦了啊”

开发老大:“就差不多这样!”

回到工位,我开始思考起来,“好歹是个程序员,这点监控还有自己手动去看吗?”。由于内网无法发邮件,但是

我们能通过xshell连接过去啊,虽然连接的ip并不是真的主机地址(连接的ip做了代理转换,转到了真正的机

器)我不管中间怎么转换的,只要我们能连接xshell,就能本地监控呗!于是我想到了Python来实现这个功能

具体思路

部署一个python脚本在内网机器上,这个内网机器必须跟之前的链接xshell的机器在一个内网上,设置为开机自

动启动,那python脚本的功能是什么,且听我细细道来:负责做一个定时任务,比如每天间隔2小时,ssh连接

到机器后,执行df -hl命令查看磁盘空间,如果磁盘空间使用率大于95%时,往收件人发送邮件。

实现

由于我从来没接触过python,但有着其他语言的基础加上现在gpt的优势,还是挺轻松的搞定了。

第一步就是安装python环境了,就像java安装JDK一样。简单就不写了

第二步得安装库,在python系统库中,并没有负责ssh连接和定时任务,所以需要引入库

pip install paramiko schedule

第三步就是写代码了:sob::sob:,这是最麻烦的啦,在一步一步调式之后,终于写好了。

import schedule
import time
import smtplib
import email.utils
from email.mime.text import MIMEText
import paramiko
import logging
from logging import handlers

logger = logging.getLogger()
formatter = logging.Formatter('%(asctime)s - %(filename)s[line:%(lineno)d] - %(levelname)s: %(message)s')
# 控制台日志
stream_handler = logging.StreamHandler()
stream_handler.setFormatter(formatter)
# 文件日志
file_handler = handlers.TimedRotatingFileHandler(filename='monitor.log', when='D')
file_handler.setFormatter(formatter)

logger.setLevel(level=logging.INFO)
logger.addHandler(stream_handler)
logger.addHandler(file_handler)

ip = ''
username = ''
password = ''

monitor_location = ""

from_addr = ""
# 授权码
email_password = ""
to_addrs = [""]
# smtp服务器地址
smtp_server = "smtp.qq.com"
# smtp服务器端口
smtp_port = 465
# 邮件标题
subject = "磁盘使用警告"
# 间隔查询时间
sleep_time = 1

def job():
    ssh = paramiko.SSHClient()
    # 自动添加主机密钥
    ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())
    ssh.connect(ip, username=username, password=password)
    stdin, stdout, stderr = ssh.exec_command('df -hl')
    lines = stdout.readlines()
    logger.info(lines)
    for line in lines:
        logger.info(line)
        if monitor_location in line:
            userage = int(line.split()[4].strip('%'))
            if userage > 95:
                send_mail(subject, '\n'.join(lines))
    ssh.close()

def send_mail(subject, _text):
    # 邮件内容
    msg = MIMEText(_text, 'plain', 'utf-8')
    msg['From'] = email.utils.formataddr(('zcn', from_addr))
    # 邮件标题
    msg['Subject'] = subject
    msg['To'] = ','.join(to_addrs)
    server = smtplib.SMTP_SSL(smtp_server, smtp_port)
    server.login(from_addr, email_password)
    try:
        server.sendmail(from_addr, to_addrs, msg.as_string())
    finally:
        server.quit()

schedule.every(sleep_time).hours.do(job)

# for i in range(24):
# for i in range(0, 24, 2):
#     schedule.every().day.at(f"{i:02d}:00").do(job)

while True:
    schedule.run_pending()
    time.sleep(1)

小小60行代码,完成需求,python就是python!:ok_hand:

标签:logging,老大,python,smtp,周五,ssh,import,崩溃,logger
From: https://blog.51cto.com/u_16130330/8316952

相关文章

  • 二叉树(周五实验)
    1#include<iostream>2#include<fstream>3usingnamespacestd;45typedefstructTreeNode6{7chardata;8intlevel;9TreeNode*lchid;10TreeNode*rchid;11}TreeNode;1213chararr[20][2];//存放结......
  • WINUI多点触控致程序崩溃
    开发的图像软件在在进行多点触摸测试时,出现了程序崩溃。查看了程序了日志,全局异常捕捉并未将这个异常捕捉到,并记录到崩溃日志里。怀疑不是程序的编码问题,可能是由于其他原因造成所致。于是习惯性的打开事件查看器,查看应用程序相关日志,找到了一条应用程序崩溃事件: 其详细信息如......
  • Linux程序崩溃自启动方法
     linux进程挂掉后,可以通过配置systemd来自动启动服务1.创建systemd服务文件,例如:huyang.service,需要放置在系统文件夹/etc/systemd/system2.编辑文件,填写详细信息3.操作systemd服务[Unit]Description=huyangSCRSserver#对服务的描述After=netw......
  • 喔唷,崩溃啦!
    Google浏览器喔唷,崩溃啦!     翻译搜索复制......
  • 谷歌Chrome及微软Edge浏览器崩溃问题处理
    问题表现近期用户在使用谷歌Chrome及微软Edge浏览器时,出现网页崩溃无法访问的情况chromeedge原因分析根据错误提示,检查日志,系C:\Windows\System32\winhafnt64.dll文件不符合微软签名规则导致的冲突根据提示信息,检查到该文件发行公司为T.E.CSolutions(GZ,)Limited,查询......
  • 如何通过一条命令让Linux系统崩溃
    如何一条命令让 Linux 系统崩溃,如何一条命令让系统不可用,如何一条命令清除所有数据。这个对于要离职的人来讲,是必须要学会的。即将离职的程序员,如果比较负责任的话,应该在离开前,将自己不再使用的电脑清理干净,如何一条命令清理硬盘,且看如下示例,用随机数擦除存储 sda中的数据:dd......
  • 因为游戏引擎崩溃所做调整引发的问题
    启动的时候GameMode里面的DefaultSpawnActor出现问题 我使用PlayerController 来Spawn,这样可以避免崩溃,我把获得到的Spawn存储到了GameInst,其实之前用PlayerController来获取,结果为None,以为没初始化成功,从GameInst里面获取结果一样为空导致问题, 我初始化Actor的时候没有O......
  • 记一次服务器Cuda驱动崩溃修复过程
    基本过程今天实验室师兄在服务器运行深度学习训练时候得到报错CUDAinitialization:UnexpectederrorfromcudaGetDeviceCount()疑似Cuda与NVIDIA显卡驱动沟通中出现了问题,使用nvidia-smi指令时提示FailedtoinitializeNVML:Driver/libraryversionmismatch,经过沟通了解到,重......
  • 在Windows下,可以使用以下步骤来捕获程序崩溃的堆栈信息
    在Windows下,Qt程序崩溃时,可以通过以下步骤捕获堆栈信息:定义一个全局的异常处理函数,在该函数中获取并保存堆栈信息。可以使用WindowsAPI函数SetUnhandledExceptionFilter来注册这个函数。LONGWINAPIUnhandledExceptionFilter(struct_EXCEPTION_POINTERS*ExceptionInfo){//在这......
  • RtlCopyMemory 崩溃
    deviceExtension=(PDEVICE_EXTENSION)DeviceObject->DeviceExtension; deviceExtension->file_name.Length=openFileInformation->file_nameLength; deviceExtension->file_name.MaximumLength=openFileInformation->file_nameLength; deviceExtens......