开发老大周五叫我过去提需求,我崩溃了😱
临近周五,心情那是一个美滋滋。结果下午开发老大就来找我了,叫我去他工位一趟,我心想:‘凉凉,这估计是来需求了’
果然,需求是这样的:
现在有个系统因为某种原因会导致数据库磁盘数据占满的情况,然后导致数据不能再存储的情况,最后导致系统
崩溃。之前已经发生过这种情况,所以老大写了一个监控job,定时去查询数据库存储是否满,满了就停止系统
提供服务,就是所谓的关闭服务。
但是这样并不能完全解决问题,只是把系统服务停了。老大的意思让我时不时去查看一下数据库的储存情况,如
果占据储存马上要满了,就通知他。
我直接当场就反驳😧:“这不能写个脚本看吗,看到磁盘使用率超过多少的时候,发送邮件?”
开发老大:“机器都是内网的,因为安全因素,不能联网”
我想😭:“那就麻烦了啊”
开发老大:“就差不多这样!”
回到工位,我开始思考起来,“好歹是个程序员,这点监控还有自己手动去看吗?”。由于内网无法发邮件,但是
我们能通过xshell连接过去啊,虽然连接的ip并不是真的主机地址(连接的ip做了代理转换,转到了真正的机
器)我不管中间怎么转换的,只要我们能连接xshell,就能本地监控呗!于是我想到了Python来实现这个功能
具体思路
部署一个python脚本在内网机器上,这个内网机器必须跟之前的链接xshell的机器在一个内网上,设置为开机自
动启动,那python脚本的功能是什么,且听我细细道来:负责做一个定时任务,比如每天间隔2小时,ssh连接
到机器后,执行df -hl命令查看磁盘空间,如果磁盘空间使用率大于95%时,往收件人发送邮件。
实现
由于我从来没接触过python,但有着其他语言的基础加上现在gpt的优势,还是挺轻松的搞定了。
第一步就是安装python环境了,就像java安装JDK一样。简单就不写了
第二步得安装库,在python系统库中,并没有负责ssh连接和定时任务,所以需要引入库
1
| pip install paramiko schedule
|
第三步就是写代码了😭😭,这是最麻烦的啦,在一步一步调式之后,终于写好了。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80
| 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_server = "smtp.qq.com"
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)
while True: schedule.run_pending() time.sleep(1)
|
小小60行代码,完成需求,python就是python!👌