Linux Shell 脚本实现每3秒钟统计 CPU 占用率、内存空间、IO、单核 CPU 占用率、CPU 占用率最高的前10个应用进程以及指定目录 /opt
的磁盘空间变化。
Shell脚本
#!/bin/bash
# 输出文件路径
OUTPUT_FILE="/var/log/system_monitor.log"
# 创建/清空输出文件
> $OUTPUT_FILE
# 获取 CPU 核心数量
NUM_CPUS=$(grep -c ^processor /proc/cpuinfo)
# 获取 CPU 占用率
function get_cpu_usage() {
# 使用 `mpstat` 工具获取所有 CPU 的占用率
CPU_USAGE=$(mpstat 1 1 | awk '/^Average:/ {print 100 - $NF}')
echo "CPU Usage: ${CPU_USAGE}%"
}
# 获取内存使用情况
function get_memory_usage() {
# 使用 `free` 命令获取内存使用情况
MEM_INFO=$(free -m | awk '/Mem:/ {print $3 "MB used, " $4 "MB free"}')
echo "Memory Usage: ${MEM_INFO}"
}
# 获取 IO 使用情况
function get_io_usage() {
# 使用 `iostat` 获取 IO 使用率
IO_INFO=$(iostat -dx 1 1 | awk '/^Device:/ {getline; print $1 " IO Utilization: " $NF"%"}')
echo "IO Usage: ${IO_INFO}"
}
# 获取单核 CPU 占用率
function get_per_cpu_usage() {
# 使用 `mpstat` 工具获取每个 CPU 核心的占用率
PER_CPU_USAGE=$(mpstat -P ALL 1 1 | awk '/^Average:/ && $2 ~ /[0-9]+/ {print "CPU" $2 ": " 100 - $NF "%"}')
echo "Per CPU Usage:"
echo "$PER_CPU_USAGE"
}
# 获取 CPU 占用率最高的前 10 个进程
function get_top_10_cpu_processes() {
# 使用 `ps` 命令按 CPU 占用率排序,列出前10个进程
TOP_PROCESSES=$(ps -eo pid,user,comm,%cpu,%mem --sort=-%cpu | head -n 11)
echo "Top 10 CPU-consuming processes:"
echo "$TOP_PROCESSES"
}
# 获取指定目录的磁盘空间使用情况
function get_disk_usage() {
# 使用 `df` 命令获取指定目录的磁盘使用情况
DISK_USAGE=$(df -h /opt | awk 'NR==2 {print "Disk Usage on /opt: " $3 " used, " $4 " free, " $5 " utilized"}')
echo "$DISK_USAGE"
}
# 循环每3秒钟采集一次数据
while true; do
# 获取当前时间
echo "-----------------------------------------" >> $OUTPUT_FILE
echo "Timestamp: $(date)" >> $OUTPUT_FILE
echo "-----------------------------------------" >> $OUTPUT_FILE
# 获取并输出 CPU 占用率
echo "$(get_cpu_usage)" >> $OUTPUT_FILE
# 获取并输出内存使用情况
echo "$(get_memory_usage)" >> $OUTPUT_FILE
# 获取并输出 IO 使用情况
echo "$(get_io_usage)" >> $OUTPUT_FILE
# 获取并输出每个核心的 CPU 占用率
echo "$(get_per_cpu_usage)" >> $OUTPUT_FILE
# 获取并输出 CPU 占用率最高的前10个进程
echo "$(get_top_10_cpu_processes)" >> $OUTPUT_FILE
# 获取并输出指定目录的磁盘空间使用情况
echo "$(get_disk_usage)" >> $OUTPUT_FILE
# 等待3秒钟再执行下一次采集
sleep 3
done
实现思路
-
输出文件路径:将统计信息写入
/var/log/system_monitor.log
文件中。 -
清空输出文件:每次脚本启动时,清空输出文件,以避免将新数据追加到旧数据之后。
-
获取 CPU 核心数量:通过读取
/proc/cpuinfo
文件中的信息,统计 CPU 核心数量。 -
获取 CPU 占用率:使用
mpstat
命令计算所有 CPU 的平均占用率。mpstat 1 1
表示采样1秒钟,并获取平均数据。 -
获取内存使用情况:使用
free -m
命令获取内存使用情况。free
命令可以显示系统中内存的使用情况,-m
表示以 MB 为单位显示。 -
获取 IO 使用情况:使用
iostat
命令获取磁盘 IO 使用率。iostat -dx 1 1
表示采样1秒钟,并获取详细的设备级别的 IO 使用情况。 -
获取单核 CPU 占用率:使用
mpstat -P ALL
命令获取每个 CPU 核心的占用率。-P ALL
表示显示所有 CPU 核心的统计信息。 -
获取 CPU 占用率最高的前 10 个进程:使用
ps
命令按 CPU 占用率排序,并列出前10个进程。ps -eo pid,comm,%cpu,%mem
显示进程ID、命令名、CPU占用率、内存占用率。--sort=-%cpu
表示按CPU占用率降序排序,head -n 11
显示前10个进程,包含标题行。 -
获取指定目录的磁盘空间使用情况:使用
df -h
命令获取指定目录/opt
的磁盘使用情况。df -h /opt
显示/opt
目录所在分区的已用空间、可用空间和利用率。 -
循环每3秒钟采集一次数据:使用
while true
循环和sleep 3
命令,确保脚本每3秒钟采集一次数据。
日志文件
日志文件 system_monitor.log
会被持续更新,每次采集到的数据会被追加到该文件中。通过 tail -f /var/log/system_monitor.log
实时查看监控数据。
总结
Shell脚本实现每3秒钟监控系统的 CPU 占用率、内存使用情况、IO使用情况、每个 CPU 核心的占用率、CPU 占用率最高的前10个进程以及 /opt
目录的磁盘空间变化。这有助于实时了解系统和指定目录的性能表现,并在必要时采取措施。