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

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

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

果然,需求是这样的:

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

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

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

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

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

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

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

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

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

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

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

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

具体思路

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

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

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

实现

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

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

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

pip install paramiko schedule

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

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!👌

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值