Python写个轻量服务器巡检脚本:CPU、内存、磁盘一次看清
很多小服务器出问题时,现场往往不是缺工具,而是缺一张“一眼能看清”的表:CPU 是不是被某个进程吃满了,内存是真的不够还是缓存占得多,磁盘是哪个分区先到红线。装一套重型监控当然可以,但对只有一两台机器的个人项目和测试环境来说,维护成本反而比机器本身还高。这篇文章的做法,是用 Python 写一个不到两百行的轻量巡检脚本,只依赖标准库,跑一次就输出一张表,顺手放进定时任务,每天早上看一眼就够了。
先定好巡检口径
巡检最怕“每个指标都看,但每个都不准”。我的口径只有四条:第一,CPU 看 1 分钟平均负载和瞬时使用率,负载高但使用率不高,往往是等 IO;第二,内存看可用内存而不是空闲内存,Linux 会把空闲内存拿去做缓存,空闲少不等于不够用;第三,磁盘只看根分区和数据分区的使用率,超过 80% 预警、超过 90% 报警;第四,进程只看占用 CPU 和内存前五名,避免把全量进程表打出来淹没重点。阈值写成命令行参数,不要写死在代码里,因为开发机和生产机的红线本来就不一样。
数据从哪里来
在 Linux 上,这几个指标都不需要第三方库。CPU 可以读 /proc/stat,两次采样算差值;内存读 /proc/meminfo,重点取 MemTotal、MemAvailable;磁盘用 shutil.disk_usage,一行就能拿到总量、已用和空闲;系统负载用 os.getloadavg;开机时长读 /proc/uptime。如果机器上装了 psutil,也可以优先用它,接口更稳,但脚本要留好回退路径:没有 psutil 时自动走 /proc 路线,而不是直接报错退出。一个巡检脚本如果在最需要它的时候因为缺依赖而跑不起来,就失去了存在的意义。
一个可直接跑的版本
import os, shutil, sys, time
def read_stat():
parts = open('/proc/stat').readline().split()[1:]
nums = [int(x) for x in parts]
return nums[0] + nums[1] + nums[2], sum(nums)
def cpu_percent():
busy1, total1 = read_stat()
time.sleep(1)
busy2, total2 = read_stat()
return round((busy2 - busy1) / max(total2 - total1, 1) * 100, 1)
def mem_info():
data = {}
for line in open('/proc/meminfo'):
key, value = line.split(':')
data[key] = int(value.split()[0]) // 1024
used = data['MemTotal'] - data['MemAvailable']
return used, data['MemTotal'], round(used / data['MemTotal'] * 100, 1)
def main():
warn = float(sys.argv[1]) if len(sys.argv) > 1 else 80
load1, load5, load15 = os.getloadavg()
mem_used, mem_total, mem_pct = mem_info()
root = shutil.disk_usage('/')
disk_pct = round(root.used / root.total * 100, 1)
print(f"CPU: {cpu_percent()}% 负载: {load1:.2f} / {load5:.2f} / {load15:.2f}")
print(f"内存: {mem_used}MB / {mem_total}MB ({mem_pct}%)")
print(f"根分区: {root.used // (1024**3)}GB / {root.total // (1024**3)}GB ({disk_pct}%)")
bad = [x for x in [mem_pct, disk_pct] if x >= warn]
print('状态: 需要关注' if bad else '状态: 正常')
return 2 if disk_pct >= 90 or mem_pct >= 90 else 0
if __name__ == '__main__':
raise SystemExit(main())
怎么用才不流于形式
先在本地跑通,再放进 crontab,例如每天 9 点跑一次并把结果追加到日志;磁盘超过 90% 时让脚本返回非零退出码,配合简单的邮件或 webhook 告警,而不是只把结果写进一个没人看的文件。每周花五分钟翻一次趋势更有价值:内存占用是不是每周涨一点,有没有日志目录在悄悄变大,负载高峰是不是固定出现在某个定时任务时段。巡检的价值不在脚本本身,而在“固定时间、固定口径、固定动作”这三点。先把这张表跑起来,再根据自己的机器慢慢加进程、端口和服务存活检查,工具自然会越长越顺手。
- 点赞
- 收藏
- 关注作者
评论(0)