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

虽然市面上有 Nagios、Zabbix、Prometheus 等强大的监控解决方案,但一个轻量级的自定义脚本仍有其独特价值:
- 轻量高效: 无需安装复杂代理或服务,资源占用极低,特别适合资源受限或临时监控需求。
- 高度定制: 完全根据您的特定关注点(如特定进程、日志文件、业务指标)量身定制监控逻辑和告警阈值。
- 快速部署: 脚本编写完成后,复制到目标机器,设置定时任务即可运行,部署迅速。
- 学习与理解: 亲手编写脚本能加深您对 Linux 系统指标和命令的理解,提升故障排查能力。
核心监控要素:脚本关注什么?
一个基础但全面的监控脚本通常会覆盖以下关键领域:
- CPU 利用率: 系统处理能力的核心指标,过高或持续的负载可能意味着资源瓶颈或程序异常。
- 内存使用情况: 包括物理内存 (RAM) 和交换空间 (Swap) 的使用率,Swap 使用过多会显著拖慢系统性能。
- 磁盘空间: 根分区 () 或其他关键分区(如
/var
,/home
)的剩余空间,磁盘耗尽是常见且严重的故障点。 - 磁盘 I/O: 读写负载过高可能导致系统响应迟缓。
- 系统负载:
Load Average
反映了系统在一段时间内的平均负载状况(1分钟、5分钟、15分钟),是判断系统繁忙程度的重要参考。 - 关键进程状态: 确保如 Web 服务器 (Nginx/Apache)、数据库 (MySQL/MariaDB/PostgreSQL)、SSH 服务等核心进程持续运行。
- 网络连接状态: 监控关键端口的监听情况(如 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
脚本使用说明与优化建议

-
配置修改:
- 将
your_email@example.com
替换为您的真实邮箱。 - 根据服务器磁盘结构修改
PARTITIONS
列表。 - 调整
DISK_WARN/CRITICAL
,MEM_WARN/CRITICAL
,SWAP_WARN/CRITICAL
,LOAD_WARN/CRITICAL
为符合您服务器实际负载情况的阈值。LOAD_WARN/CRITICAL
的计算通常与 CPU 核心数相关,示例中给出了简单倍数关系,需根据业务特性调整。 - 在
CRITICAL_PROCESSES
中列出您需要监控的核心服务进程名(使用pgrep
能识别的名字)。
- 将
-
部署运行:
- 将脚本保存到服务器上,
/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
- 邮件发送依赖: 确保服务器已安装并配置好
mailx
或sendmail
等邮件发送工具,并能将邮件发送到您的收件箱,这是脚本告警生效的关键前置条件,测试邮件发送功能:echo "Test" | mail -s "Test Mail" your_email@example.com
。
- 将脚本保存到服务器上,
-
扩展与增强:
- 日志记录: 修改脚本,将每次运行的结果(即使正常)记录到日志文件中,便于后续分析趋势,在脚本末尾
else
部分添加日志记录。 - 更精细的磁盘 I/O: 使用
iostat -dx 1 2
或vmstat 1 2
命令获取更详细的磁盘 I/O 统计(如 await, util%),并设置相应阈值告警。 - 网络监控: 使用
netstat -ant
或ss -s
监控特定端口状态或总连接数。 - 应用层监控: 集成简单的 HTTP 请求 (
curl
)、数据库连接检查 (mysqladmin ping
) 等。 - 告警方式多样化: 除了邮件,可以集成微信、钉钉、Slack 等 Webhook 接口发送告警通知(需要调用
curl
命令)。 - 历史数据存储: 将监控结果(数值)写入简单的文本文件或 SQLite 数据库,配合脚本绘制简易趋势图(如用
gnuplot
)。 - 安全考虑: 确保脚本存放目录和文件权限合理(如
root:root
和700
),避免被未授权修改。
- 日志记录: 修改脚本,将每次运行的结果(即使正常)记录到日志文件中,便于后续分析趋势,在脚本末尾
个人观点
这个脚本提供了一个坚实可靠的起点,在多年的运维工作中,我发现这类“小而美”的自定义脚本在特定场景下具有不可替代的敏捷性,它能快速响应突发需求,精准定位您最关心的核心指标,避免了大型监控系统有时存在的配置复杂和资源消耗问题,关键在于理解脚本中使用的每一个命令(如 df
, free
, uptime
, pgrep
)的含义和输出格式,这样您才能游刃有余地根据业务变化调整监控策略和告警逻辑,不要害怕修改它,实践是掌握系统监控真谛的最佳途径,将这套监控机制视为您服务器健康的第一道防线,它能为您赢得宝贵的故障响应时间,监控的价值不在于收集海量数据,而在于提供真正有行动意义的洞察。