实时Linux性能监控脚本:周期性自动统计CPU、内存和IO使用情况

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

实现思路

  1. 输出文件路径:将统计信息写入 /var/log/system_monitor.log 文件中。

  2. 清空输出文件:每次脚本启动时,清空输出文件,以避免将新数据追加到旧数据之后。

  3. 获取 CPU 核心数量:通过读取 /proc/cpuinfo 文件中的信息,统计 CPU 核心数量。

  4. 获取 CPU 占用率:使用 mpstat 命令计算所有 CPU 的平均占用率。mpstat 1 1 表示采样1秒钟,并获取平均数据。

  5. 获取内存使用情况:使用 free -m 命令获取内存使用情况。free 命令可以显示系统中内存的使用情况,-m 表示以 MB 为单位显示。

  6. 获取 IO 使用情况:使用 iostat 命令获取磁盘 IO 使用率。iostat -dx 1 1 表示采样1秒钟,并获取详细的设备级别的 IO 使用情况。

  7. 获取单核 CPU 占用率:使用 mpstat -P ALL 命令获取每个 CPU 核心的占用率。-P ALL 表示显示所有 CPU 核心的统计信息。

  8. 获取 CPU 占用率最高的前 10 个进程:使用 ps 命令按 CPU 占用率排序,并列出前10个进程。ps -eo pid,comm,%cpu,%mem 显示进程ID、命令名、CPU占用率、内存占用率。--sort=-%cpu 表示按CPU占用率降序排序,head -n 11 显示前10个进程,包含标题行。

  9. 获取指定目录的磁盘空间使用情况:使用 df -h 命令获取指定目录 /opt 的磁盘使用情况。df -h /opt 显示 /opt 目录所在分区的已用空间、可用空间和利用率。

  10. 循环每3秒钟采集一次数据:使用 while true 循环和 sleep 3 命令,确保脚本每3秒钟采集一次数据。

日志文件

日志文件 system_monitor.log 会被持续更新,每次采集到的数据会被追加到该文件中。通过 tail -f /var/log/system_monitor.log 实时查看监控数据。

总结

Shell脚本实现每3秒钟监控系统的 CPU 占用率、内存使用情况、IO使用情况、每个 CPU 核心的占用率、CPU 占用率最高的前10个进程以及 /opt 目录的磁盘空间变化。这有助于实时了解系统和指定目录的性能表现,并在必要时采取措施。

### Shell脚本实现服务器资源监控并发送告警 为了满足需求,可以编写一个Shell脚本来定期采集服务器的CPU内存、磁盘、网络IO以及带宽数据,并在这些指标超出预设阈值时发出告警通知。以下是具体方法: #### 数据采集工具的选择 `collectl` 是一款强大的系统性能分析工具,能够以类似于 `dstat` 的方式报告系统的统计信息[^1]。通过该工具可轻松获取 CPU内存、磁盘 IO 网络带宽的数据。 如果未安装 `collectl`,可以通过包管理器进行安装: ```bash sudo apt-get install collectl ``` 对于某些环境可能不支持 `collectl` 或者需要更灵活的方式,则可以选择基于标准命令(如 `top`, `free`, `df`, `sar`, `ifconfig` 等)构建自定义逻辑。 --- #### 脚本设计思路 以下是一个完整的 Shell 脚本示例,用于监控上述提到的各项资源,并在超过指定阈值时向管理员发送邮件告警。 ```bash #!/bin/bash # 配置部分 THRESHOLD_CPU=80 # CPU 使用率百分比阈值 THRESHOLD_MEMORY=75 # 内存使用率百分比阈值 THRESHOLD_DISK=90 # 磁盘空间占用百分比阈值 THRESHOLD_BANDWIDTH=1000000 # 带宽字节速率阈值 (单位: 字节每秒) ALERT_EMAIL="admin@example.com" # 接收告警的通知邮箱地址 # 函数:检查 CPU 使用情况 check_cpu() { local cpu_usage=$(mpstat | awk '/Average:/ {print 100-$NF}') if (( $(echo "$cpu_usage > $THRESHOLD_CPU" | bc -l) )); then echo "警告:当前 CPU 使用率为 ${cpu_usage}% 已经超过了设定的阈值${THRESHOLD_CPU}%" | mail -s "CPU Usage Alert" "${ALERT_EMAIL}" fi } # 函数:检查内存使用情况 check_memory() { local memory_info=$(free | grep Mem) total_mem=$(echo $memory_info | awk '{print $2}') used_mem=$(echo $memory_info | awk '{print $3}') mem_percent=$((used_mem * 100 / total_mem)) if [ "$mem_percent" -gt "$THRESHOLD_MEMORY" ]; then echo "警告:当前内存使用率为 ${mem_percent}% 已经超过了设定的阈值${THRESHOLD_MEMORY}%" | mail -s "Memory Usage Alert" "${ALERT_EMAIL}" fi } # 函数:检查磁盘空间 check_disk_space() { while read -r line; do use_percent=$(echo $line | awk '{print $5}' | sed 's/%//g') partition=$(echo $line | awk '{print $1}') if [ "$use_percent" -ge "$THRESHOLD_DISK" ]; then echo "警告:分区 $partition 当前已使用 ${use_percent}% 超过了设定的阈值${THRESHOLD_DISK}%" | mail -s "Disk Space Alert" "${ALERT_EMAIL}" fi done < <(df -hP | tail -n +2) } # 函数:检查网络带宽 check_bandwidth() { bandwidth_in=$(collectl --netstats | awk '$4 ~ /[0-9]+/ && NR==2{print $4}') || true if [[ ! -z "$bandwidth_in" ]] && (( $(echo "$bandwidth_in > $THRESHOLD_BANDWIDTH" | bc -l) )); then echo "警告:当前入站网络流量为 ${bandwidth_in}B/s, 超过设定的阈值${THRESHOLD_BANDWIDTH}" | mail -s "Network Bandwidth Alert" "${ALERT_EMAIL}" fi } # 主循环 while true; do check_cpu check_memory check_disk_space check_bandwidth sleep 60 # 每隔一分钟检测一次 done ``` 此脚本实现了周期性的资源监测功能,并利用 Linux 下的标准工具完成各项任务。当任意一项资源达到或超越其对应的阈值时,会自动触发一封电子邮件给预先配置好的接收方。 --- #### 关键点说明 1. **CPU 监控**: 利用了 `mpstat` 获取平均负载比例。 2. **内存监控**: 结合 `free` 输出计算实际利用率。 3. **磁盘空间监控**: 解析 `df` 命令的结果判断各挂载点的空间状态。 4. **网络带宽监控**: 运用 `collectl` 提供实时吞吐量统计数据。 5. **告警机制**: 使用内置命令 `mail` 发送简单的文本消息至目标电子信箱;需确保主机具备 SMTP 功能或者正确设置了外部服务连接参数。 --- #### 注意事项 - 如果环境中缺少必要的二进制文件 (`mpstat`, `collectl`) ,则应先按照官方文档指导完成相应组件的部署工作。 - 对于生产级别应用来说,建议采用更加健壮的日志记录方案代替单纯打印日志到终端屏幕之上。 - 可扩展性方面考虑加入更多维度比如进程数限制、温度感应等等依据业务场景定制化调整策略。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值