Python 定时巡检:给个人 Linux 服务器做一个磁盘与日志健康检查脚本
很多个人服务器出问题都不是突然发生的,而是磁盘慢慢写满、日志悄悄膨胀,最后服务起不来才被发现。与其每天手动登录检查,不如写一个十几行的小脚本,让它每天定时巡检一次,把结果写进日志,超过阈值再提醒自己。本文用 Python 标准库实现,不依赖第三方包,适合刚接触 Linux 运维的初学者。
一、先想清楚要查什么
巡检不必面面俱到,先抓住三类最容易出事的指标:磁盘剩余空间、关键目录的大小、系统日志里最近的错误。磁盘满了会影响数据库写入和应用启动;某个日志目录几天涨几 GB,往往是程序在循环报错;日志里的 error 激增,则说明服务已经不健康。把这三件事做成一个固定动作,比装一堆监控工具更适合个人项目起步。
二、核心脚本:不到 40 行
新建文件 check_server.py,思路是先用 shutil.disk_usage 读取根分区,再遍历几个重点目录统计大小,最后扫描日志文件:
import shutil, datetime
from pathlib import Path
def check_disk(path="/"):
total, used, free = shutil.disk_usage(path)
rate = used / total * 100
print(f"{datetime.datetime.now()} 磁盘使用率: {rate:.1f}% 剩余 {free // 1024 // 1024} MB")
return rate
def check_dir(path, limit_mb=500):
size = sum(p.stat().st_size for p in Path(path).rglob("*") if p.is_file())
print(f"目录 {path}: {size // 1024 // 1024} MB")
return size // 1024 // 1024 > limit_mb
if __name__ == "__main__":
rate = check_disk("/")
big = check_dir("/var/log")
if rate > 85 or big:
print("警告: 磁盘或日志目录需要清理")
else:
print("巡检通过")
这里把告警阈值写成 85%,把重点目录阈值写成 500MB,都是可以按自己服务器的实际情况调整的数字。脚本只做检查和输出,不自动删除任何文件,这是新手最应该坚持的原则:先看清楚,再动手清理。
三、让它每天自动跑起来
Linux 自带的 cron 很适合做这件事。执行 crontab -e,加入一行,每天早上八点运行,并把输出追加到巡检日志:
0 8 * * * /usr/bin/python3 /home/user/check_server.py >> /home/user/check.log 2>&1
第一次配置后,建议先手动运行一次 python3 check_server.py,确认没有报错,再等第二天看 check.log 里是否多了一行记录。如果 cron 没有生效,多数是 Python 路径不对,或者脚本没有执行权限,改成绝对路径、加上 chmod +x 就能解决。
四、日志别让它自己长大
巡检日志本身也会增长,所以要顺手做日志轮转。可以在脚本里只保留最近七天的记录,或者用系统自带的 logrotate。更简单的做法是每周看一次 check.log,顺手删掉过期的备份文件。很多磁盘满的事故,根源就是没人管日志,自动巡检加定期清理,才能形成闭环。
五、三个容易踩的坑
第一,不要在脚本里写 rm -rf 这类破坏性命令,自动删除的风险远大于收益。第二,目录统计时遇到权限不足的文件会报错,实际使用时可以加上 try 捕获,或者只检查自己有权限的目录。第三,阈值不要设得太低,70% 就告警会让人麻木,85% 到 90% 之间比较合适,留出处理时间。
六、小结
一个定时巡检脚本的价值不在于代码多复杂,而在于把“想起来才检查”变成“每天固定检查”。先从磁盘和日志这两件事做起,跑通 cron 和日志记录,再慢慢加上内存、进程和端口检查。等你熟悉这套流程后,再去学 Prometheus 或云监控,会发现很多概念都已经在小脚本里遇到过了。
- 点赞
- 收藏
- 关注作者
评论(0)