Python写个轻量服务器巡检脚本:CPU、内存、磁盘一次看清

举报
yd_211833921 发表于 2026/10/26 00:58:40 2026/10/26
【摘要】 用 Python 标准库写一个轻量服务器巡检脚本:读 /proc 与 shutil 拿到 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 告警,而不是只把结果写进一个没人看的文件。每周花五分钟翻一次趋势更有价值:内存占用是不是每周涨一点,有没有日志目录在悄悄变大,负载高峰是不是固定出现在某个定时任务时段。巡检的价值不在脚本本身,而在“固定时间、固定口径、固定动作”这三点。先把这张表跑起来,再根据自己的机器慢慢加进程、端口和服务存活检查,工具自然会越长越顺手。

【声明】本内容来自华为云开发者社区博主,不代表华为云及华为云开发者社区的观点和立场。转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息,否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0)

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。