You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

Linux/Ubuntu 18.04如何获取系统整体CPU与内存使用率百分比?

获取Ubuntu 18.04系统整体CPU和内存使用率的命令方案

嘿,我明白你的需求了——你之前用ps命令拿到的是单个进程的CPU/内存占比,但你需要的是系统整体的使用率统计,还要输出成指定格式的文本文件对吧?这里有几个实用的方案,都是Ubuntu 18.04上可用的:

方法1:用top命令的批处理模式

top默认是交互式工具,但加上-b参数可以切换到批处理模式,适合脚本调用。这个命令会直接输出你想要的格式:

while true; do
    # 计算系统整体CPU使用率(100 - 空闲CPU百分比)
    cpu_usage=$(top -bn1 | grep 'Cpu(s)' | sed 's/.*, *\([0-9.]*\)%* id.*/\1/' | awk '{print 100 - $1}')
    # 计算系统整体内存使用率(已用内存/总内存*100)
    mem_usage=$(free | grep Mem | awk '{print $3/$2 * 100.0}')
    # 按指定格式写入文件
    echo "%CPU %MEM $(date) $cpu_usage $mem_usage" >> test.txt
    sleep 5
done

命令解释:

  • top -bn1:非交互式运行top一次,输出所有系统状态数据
  • grep + sed提取空闲CPU百分比,再通过awk计算已用CPU占比
  • free命令提取内存数据,用awk计算已用内存的百分比
  • 最后把日期、CPU、内存数据按你要的格式追加到test.txt

方法2:用vmstat工具(更简洁)

vmstat是专门输出系统虚拟内存、CPU状态的工具,输出结果更规整,适合脚本解析:

while true; do
    # 读取vmstat的最新统计数据(等待1秒后取第2次输出,避免初始值偏差)
    read _ _ _ _ _ _ _ _ _ _ us sy id _ _ _ _ _ _ _ _ <<< $(vmstat 1 2 | tail -n1)
    # 计算CPU使用率:100 - 空闲CPU占比
    cpu_usage=$(echo "100 - $id" | bc -l)
    # 计算内存使用率:(总内存 - 空闲-缓存-缓冲区)/总内存*100
    mem_total=$(free | grep Mem | awk '{print $2}')
    mem_free=$(free | grep Mem | awk '{print $4 + $6 + $7}')
    mem_usage=$(echo "($mem_total - $mem_free)/$mem_total * 100" | bc -l)
    # 写入文件
    echo "%CPU %MEM $(date) $cpu_usage $mem_usage" >> test.txt
    sleep 5
done

命令解释:

  • vmstat 1 2:等待1秒后输出2次系统状态,取最后一行的稳定统计值
  • bc -l做浮点运算,保证使用率的小数精度
  • 内存计算里把空闲、缓冲区、缓存都算成“可用内存”,得到更准确的已用占比

方法3:直接读取/proc文件系统(无额外依赖)

Linux系统的/proc目录下保存着实时的系统状态数据,不需要任何额外工具就能读取,适合最小化环境:

while true; do
    # 读取CPU统计数据(/proc/stat记录系统启动以来的CPU时间)
    read cpu user nice system idle iowait irq softirq steal <<< $(cat /proc/stat | grep '^cpu ')
    total_cpu_time=$((user + nice + system + idle + iowait + irq + softirq + steal))
    used_cpu_time=$((total_cpu_time - idle))
    cpu_usage=$(echo "scale=1; $used_cpu_time / $total_cpu_time * 100" | bc)

    # 读取内存统计数据(/proc/meminfo记录内存详细状态)
    mem_total=$(grep MemTotal /proc/meminfo | awk '{print $2}')
    mem_free=$(grep MemFree /proc/meminfo | awk '{print $2}')
    mem_buffers=$(grep Buffers /proc/meminfo | awk '{print $2}')
    mem_cached=$(grep Cached /proc/meminfo | awk '{print $2}')
    used_mem=$((mem_total - mem_free - mem_buffers - mem_cached))
    mem_usage=$(echo "scale=1; $used_mem / $mem_total * 100" | bc)

    # 写入文件
    echo "%CPU %MEM $(date) $cpu_usage $mem_usage" >> test.txt
    sleep 5
done

命令解释:

  • /proc/statcpu行记录了各类CPU时间的累计值,通过计算已用时间占总时间的比例得到使用率
  • /proc/meminfo里的各项内存指标,计算真实已用内存(排除缓存和缓冲区)的占比
  • bc设置小数精度,让输出和你期望的格式一致

以上三种方法都能输出你想要的格式,比如:

%CPU %MEM Wed Jan 9 11:26:39 -03 2019 53.0 32.2

你可以根据自己的需求选择其中一种,直接替换掉你原来的命令即可。

内容的提问来源于stack exchange,提问作者Isaac Barros

火山引擎 最新活动