HCRM博客

CentOS 系统监控脚本如何创建与使用?

在管理 CentOS 服务器时,实时掌握系统运行状况如同掌控航行中的船舵,至关重要,一个精心设计的系统监控脚本,就是您不可或缺的仪表盘,它能自动化关键指标的收集,及时发出预警,让您从被动救火转向主动运维,我们就来探讨如何构建一个实用、高效的 CentOS 基础监控脚本,助您提升服务器的稳定性和运维效率。

为什么需要自定义监控脚本?

CentOS 系统监控脚本如何创建与使用?-图1

虽然市面上有 Nagios、Zabbix、Prometheus 等强大的监控解决方案,但一个轻量级的自定义脚本仍有其独特价值:

  1. 轻量高效: 无需安装复杂代理或服务,资源占用极低,特别适合资源受限或临时监控需求。
  2. 高度定制: 完全根据您的特定关注点(如特定进程、日志文件、业务指标)量身定制监控逻辑和告警阈值。
  3. 快速部署: 脚本编写完成后,复制到目标机器,设置定时任务即可运行,部署迅速。
  4. 学习与理解: 亲手编写脚本能加深您对 Linux 系统指标和命令的理解,提升故障排查能力。

核心监控要素:脚本关注什么?

一个基础但全面的监控脚本通常会覆盖以下关键领域:

  1. CPU 利用率: 系统处理能力的核心指标,过高或持续的负载可能意味着资源瓶颈或程序异常。
  2. 内存使用情况: 包括物理内存 (RAM) 和交换空间 (Swap) 的使用率,Swap 使用过多会显著拖慢系统性能。
  3. 磁盘空间: 根分区 () 或其他关键分区(如 /var, /home)的剩余空间,磁盘耗尽是常见且严重的故障点。
  4. 磁盘 I/O: 读写负载过高可能导致系统响应迟缓。
  5. 系统负载: Load Average 反映了系统在一段时间内的平均负载状况(1分钟、5分钟、15分钟),是判断系统繁忙程度的重要参考。
  6. 关键进程状态: 确保如 Web 服务器 (Nginx/Apache)、数据库 (MySQL/MariaDB/PostgreSQL)、SSH 服务等核心进程持续运行。
  7. 网络连接状态: 监控关键端口的监听情况(如 80, 443, 22)或特定服务的连接数。

构建您的 CentOS 监控脚本 (Bash 示例)

下面是一个基础的 Bash 脚本示例,它监控上述部分核心指标,并在检测到问题时发送邮件告警,您需要根据实际环境(如邮件服务器配置、关键分区、进程名、告警阈值)进行调整。

#!/bin/bash
# CentOS 基础系统监控脚本
# 作者:[您的名字/网站名]
# 功能:监控 CPU、内存、磁盘、负载、关键进程,并邮件告警
# 配置区 - 请务必修改!
####################################################################
RECIPIENT="your_email@example.com"   # 接收告警邮件的邮箱
HOSTNAME=$(hostname)                 # 获取主机名
SUBJECT_PREFIX="[系统告警] - $HOSTNAME - " # 邮件主题前缀
# 关键分区列表 (监控使用率,空格分隔)
PARTITIONS="/ /var /home"
# 分区使用率告警阈值 (%)
DISK_WARN=80
DISK_CRITICAL=90
# 内存使用率告警阈值 (%)
MEM_WARN=80
MEM_CRITICAL=90
# Swap 使用率告警阈值 (%)
SWAP_WARN=20
SWAP_CRITICAL=50
# 系统负载告警阈值 (通常建议为 CPU 核心数)
# 获取逻辑 CPU 核心数
CPU_CORES=$(nproc)
# 设置负载阈值 (1分钟负载 > 核心数*2 告警)
LOAD_WARN=$(($CPU_CORES * 2))
LOAD_CRITICAL=$(($CPU_CORES * 4))
# 关键进程列表 (检查是否在运行,空格分隔)
CRITICAL_PROCESSES="sshd mysqld nginx"
####################################################################
# 告警信息临时文件
ALERT_FILE="/tmp/system_alert_$$.tmp"
touch $ALERT_FILE
# 函数:发送告警邮件
send_alert() {
    local SUBJECT="$1"
    local MESSAGE="$2"
    echo -e "$MESSAGE" | mail -s "$SUBJECT_PREFIX$SUBJECT" "$RECIPIENT"
    rm -f $ALERT_FILE # 发送后删除临时文件
    exit 1 # 遇到严重问题可考虑退出,或注释掉以继续检查其他项
}
# 1. 检查磁盘空间
for PARTITION in $PARTITIONS; do
    USAGE=$(df -hP $PARTITION | awk 'NR==2 {print $5}' | tr -d '%')
    if [ $USAGE -ge $DISK_CRITICAL ]; then
        echo "严重: 分区 $PARTITION 使用率 ${USAGE}% >= ${DISK_CRITICAL}%!" >> $ALERT_FILE
    elif [ $USAGE -ge $DISK_WARN ]; then
        echo "警告: 分区 $PARTITION 使用率 ${USAGE}% >= ${DISK_WARN}%!" >> $ALERT_FILE
    fi
done
# 2. 检查内存使用
MEM_INFO=$(free | awk 'NR==2 {print $3/$2 * 100.0}')
MEM_USAGE=$(printf "%.0f" $MEM_INFO)
if [ $MEM_USAGE -ge $MEM_CRITICAL ]; then
    echo "严重: 内存使用率 ${MEM_USAGE}% >= ${MEM_CRITICAL}%!" >> $ALERT_FILE
elif [ $MEM_USAGE -ge $MEM_WARN ]; then
    echo "警告: 内存使用率 ${MEM_USAGE}% >= ${MEM_WARN}%!" >> $ALERT_FILE
fi
# 3. 检查 Swap 使用
SWAP_INFO=$(free | awk 'NR==3 {if ($2 > 0) print $3/$2 * 100.0; else print 0}')
SWAP_USAGE=$(printf "%.0f" $SWAP_INFO)
if [ $SWAP_USAGE -ge $SWAP_CRITICAL ]; then
    echo "严重: Swap 使用率 ${SWAP_USAGE}% >= ${SWAP_CRITICAL}%!" >> $ALERT_FILE
elif [ $SWAP_USAGE -ge $SWAP_WARN ]; then
    echo "警告: Swap 使用率 ${SWAP_USAGE}% >= ${SWAP_WARN}%!" >> $ALERT_FILE
fi
# 4. 检查系统负载 (1分钟平均)
LOAD_1MIN=$(uptime | awk -F 'load average:' '{print $2}' | cut -d, -f1 | tr -d ' ')
# 将负载值乘以100转换为整数便于比较 (避免bash浮点比较问题)
LOAD_INT=$(echo "$LOAD_1MIN * 100" | bc | awk -F. '{print $1}')
if [ $LOAD_INT -ge $(($LOAD_CRITICAL * 100)) ]; then
    echo "严重: 1分钟负载 $LOAD_1MIN >= $LOAD_CRITICAL!" >> $ALERT_FILE
elif [ $LOAD_INT -ge $(($LOAD_WARN * 100)) ]; then
    echo "警告: 1分钟负载 $LOAD_1MIN >= $LOAD_WARN!" >> $ALERT_FILE
fi
# 5. 检查关键进程
for PROCESS in $CRITICAL_PROCESSES; do
    if ! pgrep -x "$PROCESS" > /dev/null; then
        echo "严重: 关键进程 $PROCESS 未运行!" >> $ALERT_FILE
    fi
done
# 6. (可选扩展点) 检查磁盘I/O - 使用vmstat或iostat
# ... 此处可添加更复杂的I/O监控逻辑 ...
# 7. (可选扩展点) 检查网络连接/端口
# ... 例如使用 `netstat` 或 `ss` 检查端口监听 ...
# 判断是否需要发送告警
if [ -s $ALERT_FILE ]; then
    ALERT_CONTENT=$(cat $ALERT_FILE)
    send_alert "系统异常" "$ALERT_CONTENT"
else
    # 可以在此添加记录正常日志的逻辑
    rm -f $ALERT_FILE
fi
exit 0

脚本使用说明与优化建议

CentOS 系统监控脚本如何创建与使用?-图2
  1. 配置修改:

    • your_email@example.com 替换为您的真实邮箱。
    • 根据服务器磁盘结构修改 PARTITIONS 列表。
    • 调整 DISK_WARN/CRITICAL, MEM_WARN/CRITICAL, SWAP_WARN/CRITICAL, LOAD_WARN/CRITICAL 为符合您服务器实际负载情况的阈值。LOAD_WARN/CRITICAL 的计算通常与 CPU 核心数相关,示例中给出了简单倍数关系,需根据业务特性调整。
    • CRITICAL_PROCESSES 中列出您需要监控的核心服务进程名(使用 pgrep 能识别的名字)。
  2. 部署运行:

    • 将脚本保存到服务器上,/usr/local/bin/system_monitor.sh
    • 赋予执行权限:chmod +x /usr/local/bin/system_monitor.sh
    • 配置 cron 定时任务(如每5分钟运行一次):
      crontab -e
      # 添加一行 (示例为每5分钟运行)
      */5 * * * * /usr/local/bin/system_monitor.sh > /dev/null 2>&1
    • 邮件发送依赖: 确保服务器已安装并配置好 mailxsendmail 等邮件发送工具,并能将邮件发送到您的收件箱,这是脚本告警生效的关键前置条件,测试邮件发送功能:echo "Test" | mail -s "Test Mail" your_email@example.com
  3. 扩展与增强:

    • 日志记录: 修改脚本,将每次运行的结果(即使正常)记录到日志文件中,便于后续分析趋势,在脚本末尾 else 部分添加日志记录。
    • 更精细的磁盘 I/O: 使用 iostat -dx 1 2vmstat 1 2 命令获取更详细的磁盘 I/O 统计(如 await, util%),并设置相应阈值告警。
    • 网络监控: 使用 netstat -antss -s 监控特定端口状态或总连接数。
    • 应用层监控: 集成简单的 HTTP 请求 (curl)、数据库连接检查 (mysqladmin ping) 等。
    • 告警方式多样化: 除了邮件,可以集成微信、钉钉、Slack 等 Webhook 接口发送告警通知(需要调用 curl 命令)。
    • 历史数据存储: 将监控结果(数值)写入简单的文本文件或 SQLite 数据库,配合脚本绘制简易趋势图(如用 gnuplot)。
    • 安全考虑: 确保脚本存放目录和文件权限合理(如 root:root700),避免被未授权修改。

个人观点

这个脚本提供了一个坚实可靠的起点,在多年的运维工作中,我发现这类“小而美”的自定义脚本在特定场景下具有不可替代的敏捷性,它能快速响应突发需求,精准定位您最关心的核心指标,避免了大型监控系统有时存在的配置复杂和资源消耗问题,关键在于理解脚本中使用的每一个命令(如 df, free, uptime, pgrep)的含义和输出格式,这样您才能游刃有余地根据业务变化调整监控策略和告警逻辑,不要害怕修改它,实践是掌握系统监控真谛的最佳途径,将这套监控机制视为您服务器健康的第一道防线,它能为您赢得宝贵的故障响应时间,监控的价值不在于收集海量数据,而在于提供真正有行动意义的洞察。

本站部分图片及内容来源网络,版权归原作者所有,转载目的为传递知识,不代表本站立场。若侵权或违规联系Email:zjx77377423@163.com 核实后第一时间删除。 转载请注明出处:https://blog.huochengrm.cn/pc/34615.html

分享:
扫描分享到社交APP
上一篇
下一篇
发表列表
请登录后评论...
游客 游客
此处应有掌声~
评论列表

还没有评论,快来说点什么吧~