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

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

果然,需求是这样的:

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

崩溃。之前已经发生过这种情况,所以老大写了一个监控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服务器地址
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!👌