利用shell脚本监控linux中CPU、内存和磁盘利用率。(centos7)

本文介绍利用shell脚本在CentOS 7系统中监控CPU、内存和磁盘利用率。通过vmstat工具和/proc/stat文件计算CPU利用率,free工具监控内存利用率,df命令监控磁盘利用率,当利用率超80%报警,还可提取占用资源高的进程,同时介绍查看CPU物理信息的方法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

利用shell脚本监控linux中CPU、内存和磁盘利用率。(centos7)

2017年11月21日 11:42:00 阅读数:182

  这篇博客中所写的,在实际工作中并没有什么卵用,工作中并不会用到这种脚本去监控。不过自己写一遍,可以让初学者对CPU、内存、磁盘等一些基础知识和基础命令更加了解。

1、利用vmstat工具监控CPU详细信息,然后基于/proc/stat计算CPU利用率进行监控,超过80报警并提取出占用cpu最高的前十进程。

vmstat是Linux系统监控工具,使用vmstat命令可以得到关于进程、内存、内存分页、堵塞IO、traps及CPU活动的信息。

r:运行队列中的进程数;b:等待IO的进程数。

swpd:已用虚拟内存大小(k);free:空闲内存大小;buff:已用缓冲大小;cache:已用缓存大小。

si:每秒从交换区写入内存的大小(kb/s);so:每秒从内存写入交换分区的大小。

bi:每秒读取的块数;bo每秒写入的块数。

in:每秒中断数,包括时钟中断;cs:每秒上下文切换数。

us(user time):用户进程执行消耗cpu时间;sy(system time):系统进程执行消耗cpu时间;id:空闲时间(包括IO等待时间);wa:等待IO时间。

/proc/stat:

    这个文件包含了所有CPU活动的信息,该文件中的所有值都是从系统启动开始累计到当前时刻。可以利用其中信息计算cpu的利用率。

每行每个参数的意思为(以第一行为例,单位:jiffies,1jiffies=0.01秒):

user(62124):从系统启动开始累计到当前时刻,用户态的CPU时间,不包含 nice值为负进程。

nice(11):从系统启动开始累计到当前时刻。

system(47890):从系统启动开始累计到当前时刻,nice值为负的进程所占用的CPU时间。

idle(8715270):从系统启动开始累计到当前时刻,除硬盘IO等待时间以外其它等待时间。

iowait(84729):从系统启动开始累计到当前时刻,硬盘IO等待时间。

irq(0):从系统启动开始累计到当前时刻,硬中断时间。

softirq(1483):从系统启动开始累计到当前时刻,软中断时间。

CPU时间=user+nice+system+idle+iowait+irq+softirq。

CPU利用率=(idle2-idle1)/(cpu2-cpu1)*100。

ps aux:

显示其他用户启动的进程(a)

查看系统中属于自己的进程(x)

启动这个进程的用户和启动时间 (u)

代码如下:

#!/bin/bash
#
CPU_us=$(vmstat | awk '{print $13}' | sed -n '$p')
CPU_sy=$(vmstat | awk '{print $14}' | sed -n '$p')
CPU_id=$(vmstat | awk '{print $15}' | sed -n '$p')
CPU_wa=$(vmstat | awk '{print $16}' | sed -n '$p')
CPU_st=$(vmstat | awk '{print $17}' | sed -n '$p')

CPU1=`cat /proc/stat | grep 'cpu ' | awk '{print $2" "$3" "$4" "$5" "$6" "$7" "$8}'`
sleep 5
CPU2=`cat /proc/stat | grep 'cpu ' | awk '{print $2" "$3" "$4" "$5" "$6" "$7" "$8}'`
IDLE1=`echo $CPU1 | awk '{print $4}'`
IDLE2=`echo $CPU2 | awk '{print $4}'`
CPU1_TOTAL=`echo $CPU1 | awk '{print $1+$2+$3+$4+$5+$6+$7}'`
CPU2_TOTAL=`echo $CPU2 | awk '{print $1+$2+$3+$4+$5+$6+$7}'`
IDLE=`echo "$IDLE2-$IDLE1" | bc`
CPU_TOTAL=`echo "$CPU2_TOTAL-$CPU1_TOTAL" | bc`
#echo -e "IDLE2:$IDLE2\nIDLE1:$IDLE1\nCPU2:$CPU2_TOTAL\nCPU1:$CPU1_TOTAL"
#echo -e        "IDLE:$IDLE\nCPU:$CPU_TOTAL"
RATE=`echo "scale=4;($CPU_TOTAL-$IDLE)/$CPU_TOTAL*100" | bc | awk '{printf "%.2f",$1}'`

echo -e "us=$CPU_us\tsy=$CPU_sy\tid=$CPU_id\twa=$CPU_wa\tst=$CPU_st"
echo "CPU_RATE:${RATE}%"
CPU_RATE=`echo $RATE | cut -d. -f1`
#echo   "CPU_RATE:$CPU_RATE"
if      [ $CPU_RATE -ge 80 ]
then    echo "CPU Warn"
        ps aux | grep -v USER | sort -rn -k3 | head
fi

 2、利用free工具监控内存利用率,超过80报警并提取出占用内存最高的前十进程。

代码如下:

#!/bin/bash
#
total=$(free -m | sed -n '2p' | awk '{print $2}')
used=$(free -m | sed -n '2p' | awk '{print $3}')
free=$(free -m | sed -n '2p' | awk '{print $4}')
shared=$(free -m | sed -n '2p' | awk '{print $5}')
buff=$(free -m | sed -n '2p' | awk '{print $6}')
cached=$(free -m | sed -n '2p' | awk '{print $7}')
rate=`echo "scale=2;$used/$total" | bc | awk -F. '{print $2}'`
echo -e "total\tused\tfree\tshared\tbuffer\tavailable"
echo -e "${total}M\t${used}M\t${free}M\t${shared}M\t${buff}M\t${cached}M\nrate:${rate}%"
if    [ $rate -ge 80 ]
then    echo "Memory Warn"
    ps aux | grep -v USER | sort -rn -k4 | head
fi

3、利用df命令监控磁盘利用率,超过80报警。

df :显示磁盘分区上的可使用的磁盘空间。

  -h 以更易读的方式显示;

  -P 使用POSIX的输出格式。

#!/bin/bash
#
DEV=`df -hP | grep '^/dev/*' | cut -d' ' -f1 | sort`
for I in $DEV
do dev=`df -Ph | grep $I | awk '{print $1}'`
size=`df -Ph | grep $I | awk '{print $2}'`
used=`df -Ph | grep $I | awk '{print $3}'`
free=`df -Ph | grep $I | awk '{print $4}'`
rate=`df -Ph | grep $I | awk '{print $5}'`
mount=`df -Ph | grep $I | awk '{print $6}'`
echo -e "$I:\tsize:$size\tused:$used\tfree:$free\trate:$rate\tmount:$mount"
F=`echo $rate | awk -F% '{print $1}'`
if [ $F -ge 80 ];then
    echo "$mount Warn"
    else echo "It's OK"
fi
done

CPU物理信息

查看物理cpu个数:

  cat /proc/cpuinfo | grep "physical id" | uniq | wc -l

查看cpu核数:

  cat /proc/cpuinfo | grep "cpu cores" | uniq

查看逻辑cpu个数:

  cat /proc/cpuinfo | grep "processor" | wc -l

### Linux 实时监控 CPU 内存使用情况的方法 #### 1. **top 命令** `top` 是一个非常常见的命令行工具,可以用来实时显示系统的整体状态,包括 CPU 内存使用情况。通过 `top` 可以查看当前运行的任务及其资源消耗情况。 ```bash top ``` 该命令会动态更新屏幕上的数据,默认情况下每隔几秒刷新一次。可以通过按键调整其行为,比如按 `M` 键按照内存使用量排序[^1]。 --- #### 2. **htop 工具** 虽然 `top` 功能强大,但它界面较为简单。如果需要更友好的交互体验,可以选择安装并使用 `htop`。这是一个增强版的系统监视器,支持鼠标操作颜色编码。 ```bash sudo apt install htop # 对于 Debian/Ubuntu 系统 yum install htop # 对于 CentOS/RHEL 系统 ``` 启动方式: ```bash htop ``` 相比 `top`,`htop` 提供了更加直观的视图,能够清晰展示每个进程的具体资源占用情况[^1]。 --- #### 3. **vmstat 命令** `vmstat` 能够报告关于虚拟内存CPU 活动其他系统活动的信息。它可以定期收集统计数据,并提供一种快速的方式观察系统性能趋势。 ```bash vmstat 3 # 每隔 3 秒输出一次统计信息 ``` 此命令中的参数表示时间间隔(单位为秒),用于持续监测 CPU 内存的变化情况。 --- #### 4. **free 命令** 要专注于检查内存使用情况,可以直接使用 `free` 命令来获取详细的内存分配信息。 ```bash free -h # 显示易读的人类友好格式 (-h 表示 human-readable) ``` 这个命令提供了总内存、已用内存、空闲内存以及其他相关信息的数据表单[^1]。 --- #### 5. **sar 工具 (sysstat 包的一部分)** `sar` 是另一个强大的性能分析工具,可以从多个维度记录历史数据或者即时捕获当前的状态。对于长期跟踪 CPU 或者内存负载特别有用。 安装方法如下: ```bash sudo apt-get install sysstat # 针对基于 Debian 的发行版 sudo yum install sysstat # 针对 RHEL/CentOS 发行版 ``` 执行以下命令可分别查看 CPU 内存的相关指标: ```bash sar -u 3 # 查看 CPU 利用率,每三秒采样一次 sar -r 3 # 查看内存利用率,同样也是每三秒采集一次 ``` 以上设置允许管理员深入理解服务器的工作模式以及是否存在任何异常现象[^1]。 --- #### 6. **Shell 自定义脚本** 除了现成的工具外,还可以编写自定义 Shell 脚本来满足特定需求。例如,创建一个简单的循环结构配合其他基础指令完成定时抓取功能。 以下是依据引用[2]的一个例子,展示了如何构建这样一个自动化检测方案: ```bash #!/bin/bash while true; do echo "-----------------------------" date top -bn1 | grep load | awk '{printf "CPU Load: %.2f\n", $(NF-2)}' free -m | grep Mem | awk '{printf "Memory Usage: %s/%sMB (%.2f%%)\n", $3,$2,$3*100/$2 }' iostat -c 1 2 | tail -1 | awk '{ printf "IO usage: %.2f %%\n", $(NF-1) }' sleep 3 done ``` 这段代码实现了周期性的日志打印,涵盖了 CPU 负载比例、剩余可用 RAM 数字百分比还有磁盘 IO 性能等方面的内容[^2]。 --- ### 结论 综上所述,在 Linux 中有多种途径可供选择去实现实时监控 CPU 内存的目的。无论是利用内置的基础命令还是借助第三方软件包甚至开发专属程序都各有优劣之处。具体选用哪一类取决于实际应用场景个人偏好等因素。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值