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/stat的cpu行记录了各类CPU时间的累计值,通过计算已用时间占总时间的比例得到使用率/proc/meminfo里的各项内存指标,计算真实已用内存(排除缓存和缓冲区)的占比- 用
bc设置小数精度,让输出和你期望的格式一致
以上三种方法都能输出你想要的格式,比如:
%CPU %MEM Wed Jan 9 11:26:39 -03 2019 53.0 32.2
你可以根据自己的需求选择其中一种,直接替换掉你原来的命令即可。
内容的提问来源于stack exchange,提问作者Isaac Barros




