在管理 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)的含义和输出格式,这样您才能游刃有余地根据业务变化调整监控策略和告警逻辑,不要害怕修改它,实践是掌握系统监控真谛的最佳途径,将这套监控机制视为您服务器健康的第一道防线,它能为您赢得宝贵的故障响应时间,监控的价值不在于收集海量数据,而在于提供真正有行动意义的洞察。
