零点巡航:我的实战记录
最近搞个挺有意思的项目,叫“零点巡航”,名字听着挺唬人,就是想在夜深人静的时候,让系统自己跑起来检查检查,看看有没有啥不对劲的地方,有点像汽车的定速巡航,只不过巡的是系统的状态。
起步:需求分析
一开始的需求很简单,就是定时跑几个脚本,检查服务器的CPU、内存、磁盘使用情况,还有数据库连接啥的。如果发现异常,就发个邮件或者短信给我。这需求听起来不难,但真要做起来,细节还挺多。
第一步:脚本编写
我先用Python写几个脚本,分别负责:
检查CPU使用率:用`psutil`这个库,简单几行代码就能搞定。
检查内存使用情况:也是用`psutil`,看看剩余内存够不够。
检查磁盘空间:用`os`模块,获取磁盘使用情况。
检查数据库连接:尝试连接数据库,如果连不上就报警。
这些脚本单独运行都没问题,但是要让他们定时跑起来,还得想个办法。
第二步:定时任务
最开始我想到的是`crontab`,这玩意儿在Linux上用起来挺方便的。我设置一个`cron`任务,每天零点执行这些脚本。
bash
0 0 python /path/to/check_*
但是问题来,`crontab`的日志不太好找,而且如果脚本出错,我也不知道。所以我就想着,能不能自己写一个更灵活的定时任务。
第三步:自制定时器
我用Python写一个简单的定时器,用`schedule`库来实现。这玩意儿可以很方便地定义任务的执行时间,而且还可以捕获异常。
python
import schedule
import time
import os
def check_cpu():
# CPU检查逻辑
print("Checking CPU...")
cpu_usage = *_percent(interval=1)
print(f"CPU Usage: {cpu_usage}%")
if cpu_usage > 80:
print("CPU usage is high!")
# 发送警报
def check_disk():
# 磁盘检查逻辑
print("Checking Disk Space...")
disk_usage = *_usage('/')
print(f"Disk Usage: {disk_*}%")
if disk_* > 90:
print("Disk space is running low!")
# 发送警报
*().*("00:00").do(check_cpu)
*().*("00:00").do(check_disk)
while True:
*_pending()
*(60) # 每分钟检查一次
这个定时器会每天零点执行`check_cpu`和`check_disk`这两个函数。
第四步:日志记录
为方便排查问题,我给脚本加上日志记录功能。用`logging`模块,把每次检查的结果都记录下来。
python
import logging
*(filename='zero_*', level=*,
format='%(asctime)s - %(levelname)s - %(message)s')
def check_cpu():
try:
# CPU检查逻辑
cpu_usage = *_percent(interval=1)
*(f"CPU Usage: {cpu_usage}%")
if cpu_usage > 80:
*("CPU usage is high!")
# 发送警报
except Exception as e:
*(f"Error checking CPU: {e}")
这样,每次运行的结果都会被记录到`zero_*`文件中。
第五步:报警机制
光记录日志还不够,如果真的出现问题,我需要及时收到通知。我用`smtplib`库,写一个发邮件的函数。
python
import smtplib
from * import MIMEText
def send_email(subject, message):
sender = 'your_email@*'
receiver = 'your_email@*'
password = 'your_password'
msg = MIMEText(message)
msg['Subject'] = subject
msg['From'] = sender
msg['To'] = receiver
try:
with *_SSL('*', 465) as server:
*(sender, password)
*(sender, receiver, *_string())
print("Email sent successfully!")
except Exception as e:
print(f"Error sending email: {e}")
然后在`check_cpu`和`check_disk`函数里,如果发现异常,就调用`send_email`函数发邮件给我。
第六步:部署与运行
把所有脚本都上传到服务器,然后用`nohup`命令让定时器在后台运行。
bash
nohup python /path/to/zero_* > zero_* 2>&1 &
这样,即使我关闭终端,定时器也会一直运行下去。
一点小心得
分模块编写: 把每个检查项都写成一个函数,方便维护和扩展。
详细的日志: 记录每次检查的结果,方便排查问题。
及时的报警: 出现问题及时通知,避免造成更大的损失。
异常处理: 考虑各种可能出现的异常情况,保证程序的稳定性。
这个“零点巡航”项目虽然简单,但我觉得挺实用的。它就像一个尽职尽责的守夜人,每天晚上默默地守护着我的系统,让我可以安心睡觉。以后还可以继续扩展,加入更多的检查项,让它更加智能。