云计算百科
云计算领域专业知识百科平台

7个Shell服务器巡检脚本|新手直接复制可用(附详细步骤)

本文整理了7个生产级Shell巡检脚本,覆盖系统健康、磁盘、网络、进程、安全、数据库、批量巡检场景。每个脚本都标注了配置修改点、使用步骤和新手避坑提示,复制代码就能用,适合运维新手快速上手。

脚本总览:按需求选脚本

脚本序号脚本名称核心用途适用场景
1 系统健康检查脚本 检查CPU、内存、磁盘、网络、进程等基础资源 日常服务器健康巡检(每天1次)
2 磁盘空间深度检查脚本 定位大文件、日志堆积、Inode占用问题 磁盘满预警、清理前分析
3 网络连接检查脚本 检查端口监听、TCP连接、网络连通性 网络故障排查、端口异常检测
4 应用进程健康检查脚本 监控关键进程、端口、HTTP接口响应 核心业务(Nginx/MySQL/Redis)监控
5 安全基线检查脚本 检查账户安全、SSH配置、文件权限 安全合规审计、服务器加固
6 MySQL数据库检查脚本 检查连接数、慢查询、主从复制状态 MySQL实例健康监控
7 批量服务器巡检脚本 并发巡检多台服务器,生成HTML汇总报告 多服务器集群(10台以上)管理

脚本1:系统健康状态全面检查(最常用)

脚本用途

日常巡检核心脚本,一键检查服务器CPU、内存、磁盘、网络、进程等关键指标,生成带颜色的报告,异常指标自动标黄/红。

核心功能
  • 收集系统基本信息(主机名、内核、运行时长)•

  • 检查CPU使用率+负载,显示TOP5高CPU进程

  • 检查内存/swap使用,显示TOP5高内存进程

  • 检查磁盘/Inode使用率,定位大目录

  • 检查网络接口、TCP连接状态(TIME_WAIT过多预警)

    • 检查僵尸进程、关键服务(sshd/crond)运行状态

使用步骤
  • 复制下方代码,保存为 system_health_check.sh

  • 赋予执行权限:chmod +x system_health_check.sh

  • 执行脚本:./system_health_check.sh(需root权限)

  • 定时执行(每天早8点):echo “0 8 * * * /path/to/system_health_check.sh” | crontab –

完整代码(新手注意修改配置区)

#!/bin/bash
################################################################################
# 脚本名称: system_health_check.sh
# 功能描述: 系统健康状态全面检查(新手用前改配置区!)
# 版本信息: v2.0
################################################################################

# ————————– 新手必改:配置区 ————————–
HOSTNAME=$(hostname)
DATE=$(date +"%Y-%m-%d %H:%M:%S")
# 报告保存路径(不用改,默认存/var/log)
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       # 系统负载阈值(CPU核心数*2,比如4核设8)
INODE_WARNING=80     # Inode使用率告警阈值(%)
# ——————————————————————-

# 颜色定义(不用改)
RED='\\033[0;31m'
GREEN='\\033[0;32m'
YELLOW='\\033[1;33m'
NC='\\033[0m' # 重置颜色

# 日志函数(不用改)
log() { echo "[$(date +"%Y-%m-%d %H:%M:%S")] $1" | tee -a "$REPORT_FILE"; }
log_section() { echo -e "\\n============================================================" | tee -a "$REPORT_FILE"; echo " $1" | tee -a "$REPORT_FILE"; echo "============================================================" | 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"; }

# 1. 系统基本信息(不用改)
check_basic_info() {
  log_section "1. 系统基本信息"
  log "主机名: $HOSTNAME"
  log "检查时间: $DATE"
  log "系统版本: $(cat /etc/redhat-release 2>/dev/null || cat /etc/issue | head -1)"
  log "内核版本: $(uname -r)"
  log "系统架构: $(uname -m)"
  log "运行时长: $(uptime | awk -F'up ' '{print $2}' | awk -F',' '{print $1}')"
  log "当前用户: $(whoami)"
  log "登录用户数: $(who | wc -l)"
}

# 2. CPU检查(不用改)
check_cpu() {
  log_section "2. CPU使用率检查"
   CPU_CORES=$(grep -c ^processor /proc/cpuinfo)
  log "CPU核心数: $CPU_CORES"
   
   # 获取CPU使用率(5秒平均值,更准确)
   CPU_IDLE=$(top -bn2 -d 1 | grep "Cpu(s)" | tail -1 | awk '{print $8}' | cut -d'%' -f1)
   CPU_USAGE=$(echo "scale=2; 100 – $CPU_IDLE" | bc)
  log "CPU使用率: ${CPU_USAGE}%"
   
   if (( $(echo "$CPU_USAGE > $CPU_WARNING" | bc -l) )); then
      log_warning "CPU使用率超过${CPU_WARNING}%,当前${CPU_USAGE}%"
      log "TOP 5 CPU消耗进程:"
       ps aux | sort -rn -k3 | head -5 | awk '{printf " PID: %-8s User: %-10s CPU: %-6s CMD: %s\\n", $2,$1,$3,$11}' | tee -a "$REPORT_FILE"
   else
      log_ok "CPU使用率正常: ${CPU_USAGE}%"
   fi
   
   # 系统负载检查
   LOAD_1=$(uptime | awk -F'load average:' '{print $2}' | awk -F',' '{print $1}' | xargs)
   LOAD_5=$(uptime | awk -F'load average:' '{print $2}' | awk -F',' '{print $2}' | xargs)
   LOAD_15=$(uptime | awk -F'load average:' '{print $2}' | awk -F',' '{print $3}' | xargs)
  log "系统负载: 1分钟=${LOAD_1}, 5分钟=${LOAD_5}, 15分钟=${LOAD_15}"
   
   # 负载阈值=CPU核心数*2(比如4核设8)
   LOAD_THRESHOLD=$(echo "$CPU_CORES * 2" | bc)
   if (( $(echo "$LOAD_1 > $LOAD_THRESHOLD" | bc -l) )); then
      log_warning "系统负载过高!1分钟负载${LOAD_1}超过阈值${LOAD_THRESHOLD}"
   fi
}

# 3. 内存检查(不用改)
check_memory() {
  log_section "3. 内存使用检查"
   MEM_TOTAL=$(free -m | awk 'NR==2{print $2}')
   MEM_USED=$(free -m | awk 'NR==2{print $3}')
   MEM_AVAILABLE=$(free -m | awk 'NR==2{print $7}')
   MEM_USAGE=$(echo "scale=2; $MEM_USED / $MEM_TOTAL * 100" | bc)
   
  log "内存总量: ${MEM_TOTAL}MB"
  log "已用内存: ${MEM_USED}MB"
  log "可用内存: ${MEM_AVAILABLE}MB"
  log "内存使用率: ${MEM_USAGE}%"
   
   if (( $(echo "$MEM_USAGE > $MEM_WARNING" | bc -l) )); then
      log_warning "内存使用率超过${MEM_WARNING}%,当前${MEM_USAGE}%"
      log "TOP 5 内存消耗进程:"
       ps aux | sort -rn -k4 | head -5 | awk '{printf " PID: %-8s User: %-10s MEM: %-6s CMD: %s\\n", $2,$1,$4,$11}' | tee -a "$REPORT_FILE"
   else
      log_ok "内存使用率正常: ${MEM_USAGE}%"
   fi
   
   # Swap检查(超过100MB预警)
   SWAP_TOTAL=$(free -m | awk 'NR==3{print $2}')
   SWAP_USED=$(free -m | awk 'NR==3{print $3}')
  log "Swap总量: ${SWAP_TOTAL}MB"
  log "Swap使用: ${SWAP_USED}MB"
   if [ "$SWAP_TOTAL" -gt 0 ] && [ "$SWAP_USED" -gt 100 ]; then
      log_warning "Swap使用量较高: ${SWAP_USED}MB,可能存在内存压力"
   fi
}

# 4. 磁盘检查(不用改)
check_disk() {
  log_section "4. 磁盘使用检查"
  log "磁盘分区使用情况:"
  df -h | grep -vE '^Filesystem|tmpfs|cdrom|loop' | awk '{print " " $0}' | tee -a "$REPORT_FILE"
   
   # 磁盘使用率告警
   HAS_DISK_WARNING=0
   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}%超过阈值${DISK_WARNING}%"
           HAS_DISK_WARNING=1
          log "  $MOUNT 分区占用空间最大的5个目录:"
          du -sh ${MOUNT}/* 2>/dev/null | sort -rh | head -5 | awk '{print "   " $0}' | tee -a "$REPORT_FILE"
       fi
   done < <(df -h | grep -vE '^Filesystem|tmpfs|cdrom|loop')
   
   if [ $HAS_DISK_WARNING -eq 0 ]; then
      log_ok "所有磁盘分区使用率正常"
   fi
   
   # Inode检查(避免小文件占满磁盘)
  log -e "\\nInode使用情况:"
  df -i | grep -vE '^Filesystem|tmpfs|cdrom|loop' | awk '{print " " $0}' | tee -a "$REPORT_FILE"
   while read line; do
       INODE_USAGE=$(echo $line | awk '{print $5}' | sed 's/%//')
       MOUNT=$(echo $line | awk '{print $6}')
       if [ "$INODE_USAGE" -gt "$INODE_WARNING" ]; then
          log_warning "分区 $MOUNT 的Inode使用率${INODE_USAGE}%超过阈值${INODE_WARNING}%"
       fi
   done < <(df -i | grep -vE '^Filesystem|tmpfs|cdrom|loop')
}

# 5. 网络检查(不用改)
check_network() {
  log_section "5. 网络状态检查"
  log "网络接口状态:"
  ip -br addr | awk '{print " " $0}' | tee -a "$REPORT_FILE"
   
   # TCP连接统计
  log -e "\\nTCP连接状态统计:"
  netstat -an | awk '/^tcp/ {print $6}' | sort | uniq -c | sort -rn | awk '{print " " $0}' | tee -a "$REPORT_FILE"
   
   # TIME_WAIT过多预警(超过5000)
   TIME_WAIT_COUNT=$(netstat -an | grep TIME_WAIT | wc -l)
  log "TIME_WAIT连接数: $TIME_WAIT_COUNT"
   if [ "$TIME_WAIT_COUNT" -gt 5000 ]; then
      log_warning "TIME_WAIT连接数过多: $TIME_WAIT_COUNT(可优化TCP参数)"
   fi
   
   # 监听端口检查
  log -e "\\n当前监听端口:"
  netstat -tuln | grep LISTEN | awk '{print " " $0}' | tee -a "$REPORT_FILE"
}

# 6. 进程和服务检查(不用改)
check_processes() {
  log_section "6. 进程和服务检查"
   PROCESS_COUNT=$(ps aux | wc -l)
  log "当前进程总数: $PROCESS_COUNT"
   
   # 僵尸进程检查(死进程没清理)
   ZOMBIE_COUNT=$(ps aux | awk '{print $8}' | grep -c Z)
  log "僵尸进程数: $ZOMBIE_COUNT"
   if [ "$ZOMBIE_COUNT" -gt 0 ]; then
      log_warning "发现僵尸进程!"
       ps aux | grep 'Z' | grep -v grep | awk '{print " PID: " $2 " PPID: " $3 " CMD: " $11}' | tee -a "$REPORT_FILE"
   fi
   
   # 关键服务检查(新手可加自己的服务,比如nginx/mysql)
  log -e "\\n关键服务状态检查:"
   CRITICAL_SERVICES=("sshd" "crond" "rsyslog") # 可添加服务,如"nginx" "mysqld"
   for service in "${CRITICAL_SERVICES[@]}"; do
       if systemctl is-active –quiet $service 2>/dev/null; then
          log_ok "  $service: 运行中"
       else
           # 兼容非systemd系统(如CentOS 6)
           if ps aux | grep -v grep | grep -q $service; then
              log_ok "  $service: 运行中"
           else
              log_error "  $service: 未运行(需手动启动)"
           fi
       fi
   done
}

# 7. 系统日志检查(不用改)
check_logs() {
  log_section "7. 系统日志检查"
  log "最近1小时系统错误日志:"
   if [ -f /var/log/messages ]; then
       ERROR_COUNT=$(grep -i "error\\|fail\\|critical" /var/log/messages | tail -20 | wc -l)
       if [ "$ERROR_COUNT" -gt 0 ]; then
          log_warning "发现 $ERROR_COUNT 条错误日志"
           grep -i "error\\|fail\\|critical" /var/log/messages | tail -10 | awk '{print " " $0}' | tee -a "$REPORT_FILE"
       else
          log_ok "无严重错误日志"
       fi
   fi
   
   # OOM检查(内存溢出导致进程被杀)
  log -e "\\nOOM(内存溢出)检查:"
   OOM_COUNT=$(dmesg | grep -i "out of memory" | wc -l)
   if [ "$OOM_COUNT" -gt 0 ]; then
      log_warning "发现 $OOM_COUNT 次OOM事件(需检查内存配置)"
      dmesg | grep -i "out of memory" | tail -5 | awk '{print " " $0}' | tee -a "$REPORT_FILE"
   else
      log_ok "无OOM事件"
   fi
}

# 8. 报告摘要(不用改)
generate_summary() {
  log_section "8. 巡检报告摘要"
   WARNING_COUNT=$(grep -c "\\[WARNING\\]" "$REPORT_FILE")
   ERROR_COUNT=$(grep -c "\\[ERROR\\]" "$REPORT_FILE")
  log "巡检完成时间: $(date +"%Y-%m-%d %H:%M:%S")"
  log "告警数量: $WARNING_COUNT"
  log "错误数量: $ERROR_COUNT"
   
   if [ "$ERROR_COUNT" -gt 0 ]; then
      log_error "发现 $ERROR_COUNT 个严重问题,请立即处理!"
   elif [ "$WARNING_COUNT" -gt 0 ]; then
      log_warning "发现 $WARNING_COUNT 个告警,建议关注"
   else
      log_ok "系统状态良好,无异常"
   fi
  log -e "\\n完整报告已保存至: $REPORT_FILE"
}

# 主函数(不用改)
main() {
   echo "=========================================="
   echo "   服务器健康状态巡检脚本 v2.0"
   echo "=========================================="
   echo -e "\\n"
   
   # 非root用户提示(部分检查需要root)
   if [ "$(id -u)" -ne 0 ]; then
       echo "警告: 非root用户运行,部分检查可能无法执行"
       echo -e "\\n"
   fi
   
   # 执行所有检查
  check_basic_info
  check_cpu
  check_memory
  check_disk
  check_network
  check_processes
  check_logs
  generate_summary
   
   echo -e "\\n=========================================="
   echo "   巡检完成!"
   echo "=========================================="
}

# 脚本入口(不用改)
main "$@"

新手避坑

  • 权限问题:执行前确保是root用户(sudo -i切换),否则磁盘、进程检查可能不准。

  • 命令缺失:如果提示netstat: command not found,安装依赖:yum install net-tools(CentOS)或apt install net-tools(Ubuntu)。

  • 报告查看:巡检完成后,报告存放在/var/log目录下,文件名带时间戳(如system_check_20251022_083000.log)。

  • 脚本2:磁盘空间深度检查脚本

    脚本用途

    专门定位磁盘满的原因:找出大文件、旧日志、临时文件,还能预测磁盘满的时间,给出清理建议。

    核心功能
    • 检查磁盘/Inode使用率,定位大目录(TOP10)

    • 查找超1G的大文件(可修改阈值)

    • 检查30天前未清理的旧日志

    • 清理/tmp目录下7天未使用的临时文件

    • 检查磁盘IO等待(避免IO过高导致卡顿)

    使用步骤
    • 复制代码保存为 disk_space_check.sh

    • 赋予权限:chmod +x disk_space_check.sh

    • 执行:./disk_space_check.sh(root用户)

    完整代码(新手改配置区)

    #!/bin/bash
    ################################################################################
    # 脚本名称: disk_space_check.sh
    # 功能描述: 磁盘空间深度检查(新手改配置区!)
    # 版本信息: v1.5
    ################################################################################

    # ————————– 新手必改:配置区 ————————–
    REPORT_FILE="/var/log/disk_check_$(date +%Y%m%d_%H%M%S).log"
    DISK_WARNING=80       # 磁盘使用率告警阈值(%)
    INODE_WARNING=80      # Inode使用率告警阈值(%)
    LARGE_FILE_SIZE=1G    # 大文件阈值(可改500M、2G)
    # ——————————————————————-

    # 颜色定义(不用改)
    RED='\\033[0;31m'
    GREEN='\\033[0;32m'
    YELLOW='\\033[1;33m'
    NC='\\033[0m'

    # 日志函数(不用改)
    log() { echo "[$(date +"%Y-%m-%d %H:%M:%S")] $1" | 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"; }

    # 1. 磁盘使用率检查(不用改)
    check_disk_usage() {
      log "==========================================================="
      log "1. 磁盘使用率检查"
      log "==========================================================="
      df -h | grep -vE '^Filesystem|tmpfs|cdrom|loop' | while read line; do
           USAGE=$(echo $line | awk '{print $5}' | sed 's/%//')
           MOUNT=$(echo $line | awk '{print $6}')
           AVAIL=$(echo $line | awk '{print $4}')
          log "分区: $MOUNT"
          log " 使用率: ${USAGE}%"
          log " 可用空间: $AVAIL"
           
           if [ "$USAGE" -gt "$DISK_WARNING" ]; then
              log_error " 磁盘使用率超过${DISK_WARNING}%!"
               # 显示TOP10大目录
              log " 占用空间TOP 10目录:"
              du -sh ${MOUNT}/* 2>/dev/null | sort -rh | head -10 | awk '{print "   " $0}' | tee -a "$REPORT_FILE"
               # 显示超阈值的大文件
              log " 大文件(>$LARGE_FILE_SIZE):"
               find ${MOUNT} -type f -size +${LARGE_FILE_SIZE} -exec ls -lh {} \\; 2>/dev/null | awk '{print "   " $9 " (" $5 ")"}' | head -10 | tee -a "$REPORT_FILE"
           else
              log_ok " 使用率正常"
           fi
          log ""
       done
    }

    # 2. Inode检查(小文件占满磁盘用)(不用改)
    check_inode_usage() {
      log "==========================================================="
      log "2. Inode使用率检查"
      log "==========================================================="
      df -i | grep -vE '^Filesystem|tmpfs|cdrom|loop' | while read line; do
           INODE_USAGE=$(echo $line | awk '{print $5}' | sed 's/%//')
           MOUNT=$(echo $line | awk '{print $6}')
          log "分区: $MOUNT"
          log " Inode使用率: ${INODE_USAGE}%"
           
           if [ "$INODE_USAGE" -gt "$INODE_WARNING" ]; then
              log_error " Inode使用率超过${INODE_WARNING}%!(小文件太多)"
               # 显示文件数TOP10目录
              log " 文件数量TOP 10目录:"
               for dir in $(find ${MOUNT}/* -maxdepth 0 -type d 2>/dev/null); do
                   echo "$(find $dir -type f 2>/dev/null | wc -l) $dir"
               done | sort -rn | head -10 | awk '{print "   " $1 " files: " $2}' | tee -a "$REPORT_FILE"
           else
              log_ok " Inode使用率正常"
           fi
          log ""
       done
    }

    # 3. 日志文件检查(不用改)
    check_log_files() {
      log "==========================================================="
      log "3. 日志文件大小检查"
      log "==========================================================="
       # 常见日志目录(可加自己的日志目录,如/opt/logs)
       LOG_DIRS=("/var/log" "/opt/logs" "/data/logs" "/app/logs")
       for log_dir in "${LOG_DIRS[@]}"; do
           if [ -d "$log_dir" ]; then
              log "检查目录: $log_dir"
               # 显示超100MB的日志
              log " 大日志文件(>100MB):"
               find $log_dir -type f -size +100M -exec ls -lh {} \\; 2>/dev/null | awk '{print "   " $9 " (" $5 ")"}' | head -10 | tee -a "$REPORT_FILE"
               # 日志总大小
               TOTAL_SIZE=$(du -sh $log_dir 2>/dev/null | awk '{print $1}')
              log " 总大小: $TOTAL_SIZE"
              log ""
           fi
       done
       
       # 30天前未压缩的旧日志
      log "未压缩的旧日志文件(30天前):"
       find /var/log -type f -name "*.log" -mtime +30 ! -name "*.gz" -exec ls -lh {} \\; 2>/dev/null | awk '{print " " $9 " (" $5 ")"}' | head -10 | tee -a "$REPORT_FILE"
    }

    # 4. 临时文件检查(不用改)
    check_temp_files() {
      log "==========================================================="
      log "4. 临时文件检查"
      log "==========================================================="
       # /tmp目录检查
       if [ -d "/tmp" ]; then
           TMP_SIZE=$(du -sh /tmp 2>/dev/null | awk '{print $1}')
           TMP_FILE_COUNT=$(find /tmp -type f 2>/dev/null | wc -l)
          log "/tmp目录:"
          log " 总大小: $TMP_SIZE"
          log " 文件数: $TMP_FILE_COUNT"
           
           # 7天未使用的临时文件
           OLD_TMP=$(find /tmp -type f -atime +7 2>/dev/null | wc -l)
           if [ "$OLD_TMP" -gt 0 ]; then
              log_warning " 发现 $OLD_TMP 个超过7天未访问的临时文件"
              log " 占用空间TOP 10:"
               find /tmp -type f -atime +7 -exec ls -lh {} \\; 2>/dev/null | sort -k5 -rh | head -10 | awk '{print "   " $9 " (" $5 ")"}' | tee -a "$REPORT_FILE"
           fi
       fi
       
       # /var/tmp检查
       if [ -d "/var/tmp" ]; then
           VAR_TMP_SIZE=$(du -sh /var/tmp 2>/dev/null | awk '{print $1}')
          log -e "\\n/var/tmp目录:"
          log " 总大小: $VAR_TMP_SIZE"
       fi
    }

    # 5. 磁盘IO检查(不用改)
    check_disk_io() {
      log "==========================================================="
      log "5. 磁盘IO统计"
      log "==========================================================="
       if command -v iostat &> /dev/null; then
          log "磁盘IO统计(最近1分钟):"
          iostat -x 1 2 | tail -n +4 | awk 'NF' | tail -n +2 | tee -a "$REPORT_FILE"
       else
          log_warning "未安装iostat工具(执行:yum install sysstat 安装)"
       fi
       
       # IO等待过高预警(超过20%)
       IO_WAIT=$(top -bn1 | grep "Cpu(s)" | awk '{print $10}' | sed 's/%wa,//')
      log -e "\\n当前IO等待: ${IO_WAIT}%"
       if (( $(echo "$IO_WAIT > 20" | bc -l) )); then
          log_warning "IO等待过高!(可能是磁盘性能不足)"
       fi
    }

    # 6. 清理建议(新手可直接复制执行)(不用改)
    generate_cleanup_suggestions() {
      log "==========================================================="
      log "6. 磁盘清理建议(新手复制命令执行)"
      log "==========================================================="
      log "1. 压缩30天前的旧日志:"
      log "   find /var/log -type f -name '*.log' -mtime +30 -exec gzip {} \\;"
      log -e "\\n2. 清理7天前的临时文件:"
      log "   find /tmp -type f -atime +7 -delete"
      log -e "\\n3. 清理yum缓存(CentOS):"
      log "   yum clean all"
      log -e "\\n4. 清理Docker未使用资源(如有Docker):"
      log "   docker system prune -a"
      log -e "\\n5. 清理journal日志(系统日志):"
      log "   journalctl –vacuum-time=7d"
    }

    # 主函数(不用改)
    main() {
       echo "=========================================="
       echo "   磁盘空间深度检查脚本 v1.5"
       echo "=========================================="
       echo -e "\\n"
       
      check_disk_usage
      check_inode_usage
      check_log_files
      check_temp_files
      check_disk_io
      generate_cleanup_suggestions
       
      log -e "\\n==========================================================="
      log "检查完成!"
      log "报告保存至: $REPORT_FILE"
      log "==========================================================="
    }

    main "$@"

    新手避坑

  • iostat缺失:提示iostat: command not found时,执行yum install sysstat(CentOS)或apt install sysstat(Ubuntu)。

  • 清理谨慎:执行“清理建议”中的命令前,先确认文件是否有用(比如find /tmp -type f -atime +7先查看,再删)。

  • 脚本3-7:核心脚本(精简版,重点标配置和步骤)

    脚本3:网络连接检查脚本

    用途

    检查端口监听、TCP连接状态(比如TIME_WAIT过多)、网络连通性(DNS/网关/外网)。

    使用步骤
    • 保存为 network_check.sh,赋予权限:chmod +x network_check.sh

    • 执行:./network_check.sh

    • 新手改配置区:CRITICAL_PORTS=(22 80 443 3306 6379)(添加自己的关键端口)

    核心代码(关键部分)

    #!/bin/bash
    ################################################################################
    # 脚本名称: network_check.sh
    # 功能描述: 网络连接和端口检查(新手改CRITICAL_PORTS!)
    ################################################################################

    # ————————– 新手必改:配置区 ————————–
    REPORT_FILE="/var/log/network_check_$(date +%Y%m%d_%H%M%S).log"
    TIME_WAIT_WARNING=5000  # TIME_WAIT超过5000预警
    ESTABLISHED_WARNING=10000 # 活动连接超过10000预警
    CRITICAL_PORTS=(22 80 443 3306 6379 8080) # 关键端口(如MySQL:3306,Redis:6379)
    # ——————————————————————-

    # 颜色和日志函数(同前,不用改)
    RED='\\033[0;31m'
    GREEN='\\033[0;32m'
    YELLOW='\\033[1;33m'
    NC='\\033[0m'
    log() { echo "[$(date +"%Y-%m-%d %H:%M:%S")] $1" | tee -a "$REPORT_FILE"; }
    log_warning() { echo -e "${YELLOW}[WARNING] $1${NC}" | tee -a "$REPORT_FILE"; }
    log_ok() { echo -e "${GREEN}[OK] $1${NC}" | tee -a "$REPORT_FILE"; }

    # 关键端口检查(核心功能)
    check_listening_ports() {
      log "==========================================================="
      log "3. 关键端口检查"
      log "==========================================================="
      log "当前监听端口:"
      netstat -tulnp | grep LISTEN | tee -a "$REPORT_FILE"
      log -e "\\n关键端口状态:"
       for port in "${CRITICAL_PORTS[@]}"; do
           if netstat -tuln | grep -q ":$port "; then
               PID=$(netstat -tulnp 2>/dev/null | grep ":$port " | awk '{print $7}' | cut -d'/' -f1)
               PROCESS=$(netstat -tulnp 2>/dev/null | grep ":$port " | awk '{print $7}' | cut -d'/' -f2)
              log_ok "端口 $port: 监听中(进程:$PROCESS PID:$PID)"
           else
              log_warning "端口 $port: 未监听(服务可能未启动)"
           fi
       done
    }

    # 其他函数(网络接口、TCP连接、连通性)省略,完整代码同前逻辑
    # 主函数(调用check_listening_ports等)
    main() {
       echo "=========================================="
       echo "   网络状态检查脚本 v1.0"
       echo "=========================================="
      check_network_interfaces
      check_tcp_connections
      check_listening_ports
      check_network_connectivity
      log -e "\\n检查完成! 报告: $REPORT_FILE"
    }
    main "$@"

    脚本4:应用进程健康检查脚本

    用途

    监控关键进程(Nginx/MySQL/Redis)、端口、HTTP接口响应(比如健康检查接口)。

    新手改配置区

    # 关键进程(进程名|端口,如"nginx|80,443")
    declare -A CRITICAL_PROCESSES=(
      ["nginx"]="nginx|80,443"
      ["mysql"]="mysqld|3306"
      ["redis"]="redis-server|6379"
      ["java"]="java|8080" # 如SpringBoot应用
    )

    # HTTP接口(如健康检查接口)
    declare -A HTTP_ENDPOINTS=(
      ["主页"]="http://localhost/"
      ["健康检查"]="http://localhost:8080/health"
      ["API状态"]="http://localhost:8080/api/status"
    )

    脚本5:安全基线检查脚本

    用途

    检查账户安全(空密码、多root账户)、SSH配置(禁止root登录、禁用密码登录)、文件权限(/etc/passwd等关键文件)。

    核心功能
    • 检查空密码账户、UID=0的账户(多root风险)

    • 检查SSH是否允许root登录、密码登录(不安全)

    • 检查关键文件权限(如/etc/shadow权限应为000)

    脚本6:MySQL数据库检查脚本

    用途

    检查MySQL连接数、慢查询、主从复制、InnoDB缓冲池命中率。

    新手必改配置

    # MySQL连接信息(改自己的用户名、密码、地址)
    MYSQL_USER="monitor"   # MySQL监控账户(需提前创建,给SELECT权限)
    MYSQL_PASS="your_pass" # 密码
    MYSQL_HOST="localhost" # 数据库地址
    MYSQL_PORT="3306"      # 端口

    脚本7:批量服务器巡检脚本

    用途

    并发巡检多台服务器(比如200台),生成HTML汇总报告(带颜色,可浏览器打开)。

    新手使用步骤
    准备服务器列表文件 servers.txt(格式如下):

    # Web服务器
    192.168.1.10
    192.168.1.11
    # 数据库服务器
    192.168.1.30

    改配置区(SSH信息):

    SSH_USER="root"          # SSH用户名
    SSH_KEY="~/.ssh/id_rsa"  # SSH私钥路径(免密登录用)
    CONCURRENT=10            # 并发数(同时检查10台)
    CHECK_SCRIPT="system_health_check.sh" # 要批量执行的脚本

    执行:

    ./batch_check_scheduler.sh,报告存 /var/log/batch_check_xxx/,打开summary.html看汇总。

    新手必备总结

    常用命令

    • 赋予脚本权限:chmod +x 脚本名.sh

    • 执行脚本:./脚本名.sh(root用户用sudo ./脚本名.sh)

    • 定时执行:crontab -e,添加0 8 * * * /path/to/脚本名.sh(每天8点)

    • 查看报告:cat /var/log/脚本名_20251022_083000.log

    巡检频率建议

    • 系统健康(脚本1):每天1次(早8点)

    • 磁盘检查(脚本2):每天1次

    • 进程检查(脚本4):核心业务每小时1次

    • 安全检查(脚本5):每周1次

    • 批量巡检(脚本7):集群每天1次

    避坑总览

    • 所有脚本尽量用root执行,否则检查不完整

    • 命令缺失时,根据提示安装依赖(如yum install net-tools sysstat)

    • 修改配置区时,路径、账户、密码要和实际环境一致•

    • 清理文件前,先查看(如find /tmp -type f -atime +7)再删除

    原文链接https://gegeblog.top/

    赞(0)
    未经允许不得转载:网硕互联帮助中心 » 7个Shell服务器巡检脚本|新手直接复制可用(附详细步骤)
    分享到: 更多 (0)

    评论 抢沙发

    评论前必须登录!