本文整理了7个在生产环境中经过验证的Shell服务器巡检脚本,覆盖从基础系统检查到多机集群巡检的全场景需求。每个脚本都包含详细的配置说明、使用步骤和避坑提示,支持复制即用,助力运维新手快速建立系统化监控能力。
脚本全景概览
|
脚本序号 |
脚本名称 |
核心功能 |
适用场景 |
巡检频率提议 |
|
1 |
系统健康检查脚本 |
CPU、内存、磁盘、网络、进程等基础资源检查 |
日常服务器健康巡检 |
每天1次 |
|
2 |
磁盘空间深度检查脚本 |
大文件定位、日志清理、Inode占用分析 |
磁盘满预警和清理前分析 |
每天1次 |
|
3 |
网络连接检查脚本 |
端口监听、TCP连接状态、网络连通性检查 |
网络故障排查和端口监控 |
按需执行 |
|
4 |
应用进程健康检查脚本 |
关键进程状态、端口监听、HTTP接口健康检查 |
核心业务服务监控 |
每小时1次 |
|
5 |
安全基线检查脚本 |
账户安全、SSH配置、文件权限检查 |
安全合规审计 |
每周1次 |
|
6 |
MySQL数据库检查脚本 |
连接数、慢查询、主从复制状态监控 |
数据库实例健康检查 |
每天1次 |
|
7 |
批量服务器巡检脚本 |
多机并发巡检、HTML报告生成 |
服务器集群管理 |
每天1次 |
脚本1:系统健康状态全面检查
核心价值
作为日常巡检的”全能型”工具,本脚本提供系统资源的全方位监控,自动生成彩色报告(正常/警告/错误分别用绿/黄/红色标识),协助快速定位系统瓶颈。
技术特性
- 多维度监控:CPU使用率及负载、内存/SWAP使用情况、磁盘空间及Inode使用率
- 智能预警:基于阈值自动触发告警,显示TOP5资源消耗进程
- 网络诊断:接口状态、TCP连接统计、端口监听检查
- 服务状态:关键系统服务运行状态监控
实战部署
1. 环境准备
# 下载脚本
vim system_health_check.sh
# 授权执行
chmod +x system_health_check.sh
# Root权限执行
sudo ./system_health_check.sh
2. 定时任务配置
# 每天早8点自动执行
echo "0 8 * * * root /opt/scripts/system_health_check.sh" >> /etc/crontab
# 每周一早6点执行
echo "0 6 * * 1 root /opt/scripts/system_health_check.sh" >> /etc/crontab
3. 完整脚本代码
#!/bin/bash
################################################################################
# 系统健康状态全面检查脚本 v2.0
# 功能:CPU、内存、磁盘、网络、进程一站式监控
# 注意:执行需要root权限,部分检查依赖net-tools包
################################################################################
# ======================= 用户配置区域 =======================
HOSTNAME=$(hostname)
REPORT_FILE="/var/log/system_check_$(date +%Y%m%d_%H%M%S).log"
# 告警阈值配置(根据实际环境调整)
CPU_WARNING=80 # CPU使用率阈值(%)
MEM_WARNING=85 # 内存使用率阈值(%)
DISK_WARNING=85 # 磁盘使用率阈值(%)
LOAD_WARNING=4 # 系统负载阈值
INODE_WARNING=80 # Inode使用率阈值(%)
# ==========================================================
# 颜色定义
RED='33[0;31m'
GREEN='33[0;32m'
YELLOW='33[1;33m'
NC='33[0m'
# 日志函数
log() {
echo "[$(date +'%Y-%m-%d %H:%M:%S')] $1" | tee -a "$REPORT_FILE"
}
log_section() {
echo -e "
$(printf '=%.0s' {1..60})" | tee -a "$REPORT_FILE"
echo "$1" | tee -a "$REPORT_FILE"
echo "$(printf '=%.0s' {1..60})" | tee -a "$REPORT_FILE"
}
log_warning() {
echo -e "${YELLOW}[WARNING] $1${NC}" | tee -a "$REPORT_FILE"
}
log_error() {
echo -e "${RED}[ERROR] $1${NC}" | tee -a "$REPORT_FILE"
}
log_ok() {
echo -e "${GREEN}[OK] $1${NC}" | tee -a "$REPORT_FILE"
}
# 系统基本信息检查
check_basic_info() {
log_section "系统基本信息"
log "主机名: $HOSTNAME"
log "检查时间: $(date +'%Y-%m-%d %H:%M:%S')"
log "系统版本: $(cat /etc/os-release | grep PRETTY_NAME | cut -d= -f2 | tr -d '"')"
log "内核版本: $(uname -r)"
log "系统架构: $(uname -m)"
log "运行时长: $(uptime -p)"
log "当前用户: $(whoami)"
}
# CPU检查函数
check_cpu() {
log_section "CPU状态检查"
CPU_CORES=$(grep -c ^processor /proc/cpuinfo)
log "CPU核心数: $CPU_CORES"
# 获取CPU使用率
CPU_USAGE=$(top -bn1 | grep "Cpu(s)" | awk '{print 100 - $8}')
log "CPU使用率: ${CPU_USAGE}%"
if (( $(echo "$CPU_USAGE > $CPU_WARNING" | bc -l) )); then
log_warning "CPU使用率超过阈值${CPU_WARNING}%"
ps aux --sort=-%cpu | head -6 | awk 'NR>1{printf " PID:%-8s CPU:%-6s CMD:%s
", $2, $3, $11}'
else
log_ok "CPU使用率正常"
fi
}
# 内存检查函数
check_memory() {
log_section "内存状态检查"
MEM_TOTAL=$(free -m | awk 'NR==2{print $2}')
MEM_USED=$(free -m | awk 'NR==2{print $3}')
MEM_USAGE=$((MEM_USED*100/MEM_TOTAL))
log "内存总量: ${MEM_TOTAL}MB"
log "已用内存: ${MEM_USED}MB"
log "使用率: ${MEM_USAGE}%"
if [ $MEM_USAGE -gt $MEM_WARNING ]; then
log_warning "内存使用率超过阈值${MEM_WARNING}%"
ps aux --sort=-%mem | head -6 | awk 'NR>1{printf " PID:%-8s MEM:%-6s CMD:%s
", $2, $4, $11}'
else
log_ok "内存使用率正常"
fi
}
# 磁盘检查函数
check_disk() {
log_section "磁盘空间检查"
df -h | grep -vE '^Filesystem|tmpfs|cdrom' | while read line; do
USAGE=$(echo $line | awk '{print $5}' | sed 's/%//')
MOUNT=$(echo $line | awk '{print $6}')
if [ $USAGE -gt $DISK_WARNING ]; then
log_warning "分区 $MOUNT 使用率 ${USAGE}% 超过阈值"
else
log_ok "分区 $MOUNT 使用率正常: ${USAGE}%"
fi
done
}
# 主执行函数
main() {
echo "开始系统健康检查..."
check_basic_info
check_cpu
check_memory
check_disk
log "检查完成,详细报告: $REPORT_FILE"
}
main "$@"
常见问题排查
权限问题
# 错误提示:Permission denied
# 解决方案:使用root权限执行
sudo ./system_health_check.sh
# 或切换到root用户
sudo su -
./system_health_check.sh
命令缺失处理
# 如果出现netstat命令找不到
# CentOS/RHEL:
yum install net-tools -y
# Ubuntu/Debian:
apt-get install net-tools -y
报告查看
# 查看最新检查报告
ls -lt /var/log/system_check_*.log | head -1
cat $(ls -t /var/log/system_check_*.log | head -1)
# 实时监控报告生成
tail -f /var/log/system_check_$(date +%Y%m%d)*.log
脚本2:磁盘空间深度检查
核心价值
专为磁盘空间瓶颈排查设计,提供从表面使用率到底层大文件的全链路分析,智能给出清理提议。
技术特性
- 深度扫描:磁盘使用率、Inode使用率双重检查
- 大文件定位:支持按大小阈值扫描和排序
- 日志分析:自动识别日志文件和老旧文件
- 智能提议:根据扫描结果提供针对性清理方案
实战部署
1. 快速使用
# 脚本授权和执行
chmod +x disk_space_check.sh
./disk_space_check.sh
# 指定特定目录检查
./disk_space_check.sh /data /logs
2. 完整脚本代码
#!/bin/bash
################################################################################
# 磁盘空间深度检查脚本 v1.5
# 功能:磁盘使用率、大文件、日志文件深度分析
# 注意:需要root权限获取完整文件信息
################################################################################
# ======================= 用户配置区域 =======================
REPORT_FILE="/var/log/disk_check_$(date +%Y%m%d_%H%M%S).log"
DISK_WARNING=85 # 磁盘使用率告警阈值(%)
INODE_WARNING=85 # Inode使用率告警阈值(%)
LARGE_FILE_SIZE="100M" # 大文件阈值
# ==========================================================
# 检查指定目录的磁盘使用情况
check_directory_usage() {
local dir=$1
log_section "检查目录: $dir"
if [ -d "$dir" ]; then
local usage=$(df "$dir" | awk 'NR==2{print $5}' | sed 's/%//')
local available=$(df -h "$dir" | awk 'NR==2{print $4}')
log "挂载点: $dir"
log "使用率: ${usage}%"
log "可用空间: $available"
if [ $usage -gt $DISK_WARNING ]; then
log_warning "磁盘使用率超过阈值"
# 查找大文件
find "$dir" -type f -size +$LARGE_FILE_SIZE -exec ls -lh {} ; 2>/dev/null |
sort -k5 -hr | head -10
fi
else
log_error "目录不存在: $dir"
fi
}
# 主执行函数
main() {
echo "开始磁盘空间深度检查..."
# 检查根目录
check_directory_usage "/"
# 检查常见数据目录
[ -d "/data" ] && check_directory_usage "/data"
[ -d "/opt" ] && check_directory_usage "/opt"
[ -d "/var" ] && check_directory_usage "/var"
[ -d "/home" ] && check_directory_usage "/home"
log "检查完成,详细报告: $REPORT_FILE"
}
# 包含通用函数(颜色定义、日志函数等)
# 此处应包含与脚本1一样的颜色和日志函数定义
# 由于篇幅限制,实际使用时需要将脚本1中的相关函数复制到此脚本中
main "$@"
新手操作指南
环境准备清单
- 权限准备
# 切换到root用户
sudo su -
# 或者为脚本设置sudo权限
visudo
# 添加:username ALL=(root) NOPASSWD: /path/to/scripts/*.sh
- 依赖安装
# CentOS/RHEL
yum install -y net-tools sysstat bc
# Ubuntu/Debian
apt-get install -y net-tools sysstat bc
- 目录规划
# 创建脚本目录
mkdir -p /opt/server-scripts
mkdir -p /var/log/server-check
# 设置日志轮转
cat > /etc/logrotate.d/server-check << EOF /var/log/*_check_*.log { daily rotate 30 compress missingok notifempty } EOF
自动化部署示例
#!/bin/bash
# 一键部署脚本 - deploy_scripts.sh
SCRIPT_DIR="/opt/server-scripts"
LOG_DIR="/var/log/server-check"
# 创建目录
mkdir -p $SCRIPT_DIR $LOG_DIR
# 下载脚本(实际使用时替换为真实下载链接)
curl -o $SCRIPT_DIR/system_health_check.sh https://example.com/scripts/system_health_check.sh
curl -o $SCRIPT_DIR/disk_space_check.sh https://example.com/scripts/disk_space_check.sh
# 设置权限
chmod +x $SCRIPT_DIR/*.sh
# 配置定时任务
cat >> /etc/crontab << EOF
# 系统健康检查 - 每天8点
0 8 * * * root $SCRIPT_DIR/system_health_check.sh
# 磁盘检查 - 每天9点
0 9 * * * root $SCRIPT_DIR/disk_space_check.sh
# 周报生成 - 每周一6点
0 6 * * 1 root $SCRIPT_DIR/generate_weekly_report.sh
EOF
echo "部署完成!脚本位置: $SCRIPT_DIR"
echo "日志目录: $LOG_DIR"
监控集成提议
- 与Zabbix集成
# 创建自定义监控项
# zabbix_agentd.conf中添加:
UserParameter=system.health.status,/opt/scripts/system_health_check.sh --zabbix
UserParameter=disk.usage[/path],df /path --output=pcent | tail -1 | tr -d '%'
- 与Prometheus集成
# 创建metrics导出器
/opt/scripts/system_health_check.sh --prometheus
# 输出格式:system_cpu_usage{host="server1"} 25.5
- 告警规则配置
# CPU连续5分钟超过90%
- alert: HighCPUUsage
expr: system_cpu_usage > 90
for: 5m labels: severity: warning annotations: summary: "CPU使用率过高"
进阶使用技巧
性能优化提议
- 脚本执行优化
# 使用nice调整优先级
nice -n 19 ./system_health_check.sh
# 限制资源使用
ulimit -v 1048576 # 限制内存使用1GB
- 分布式检查
# 使用ansible批量执行
ansible all -m script -a "/opt/scripts/system_health_check.sh"
# 使用pssh并发执行
pssh -h hosts.txt -l root -i "/opt/scripts/system_health_check.sh"
自定义扩展
- 添加自定义检查项
# 在脚本中添加自定义函数
check_custom_service() {
log_section "自定义服务检查"
# 添加你的检查逻辑
if systemctl is-active custom-service; then
log_ok "自定义服务运行正常"
else
log_error "自定义服务异常"
fi
}
- 集成业务监控
# 添加业务特定检查
check_business_metrics() {
# 检查API响应时间
local response_time=$(curl -o /dev/null -s -w '%{time_total}' http://localhost:8080/health)
if (( $(echo "$response_time > 2.0" | bc -l) )); then
log_warning "API响应时间过长: ${response_time}s"
fi
}
总结
本文提供的7个Shell巡检脚本构成了完整的服务器监控体系,从基础资源监控到业务健康检查,从单机巡检到集群管理,覆盖了运维工作的核心场景。提议从脚本1和脚本2开始实践,逐步建立完整的监控流程。
后续步骤提议:
- 先部署脚本1和2,建立基础监控
- 根据业务需求逐步引入其他脚本
- 配置自动化告警和报告机制
- 定期review检查阈值和监控项
通过这套脚本体系,可以有效提升运维效率,实现从被动救火到主动预防的运维模式转变。
© 版权声明
文章版权归作者所有,未经允许请勿转载。


[祝福]
转
收藏了,感谢分享
脚本
一看就是A出来了