Files
Knowledge/1 使用/Linux/7个Shell服务器巡检脚本|新手直接复制可用(附详细步骤).md
T

735 lines
29 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
---
title: "7个Shell服务器巡检脚本|新手直接复制可用(附详细步骤)"
source: "https://mp.weixin.qq.com/s/DEqH_oRSVJF_dLcl1sJpog"
author:
- "[[Python小甲鱼]]"
published:
created: 2025-10-31
description: "本文整理了7个生产级Shell巡检脚本,覆盖系统健康、磁盘、网络、进程、安全、数据库、批量巡检场景。"
tags:
- "clippings"
---
原创 Python小甲鱼 *2025年10月28日 07:01*
本文整理了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)运行状态
### 使用步骤
1. 1\. 复制下方代码,保存为 `system_health_check.sh`
2. 2\. 赋予执行权限: `chmod +x system_health_check.sh`
3. 3\. 执行脚本:`./system_health_check.sh` (需root权限)
4. 4\. 定时执行(每天早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 "$@"
```
### 新手避坑
1. 1\. **权限问题** :执行前确保是root用户(sudo -i切换),否则磁盘、进程检查可能不准。
2. 2\. **命令缺失** :如果提示 `netstat: command not found` ,安装依赖: `yum install net-tools` (CentOS)或 `apt install net-tools` (Ubuntu)。
3. 3\. **报告查看** :巡检完成后,报告存放在 `/var/log` 目录下,文件名带时间戳(如 `system_check_20251022_083000.log` )。
## 脚本2:磁盘空间深度检查脚本
### 脚本用途
专门定位磁盘满的原因:找出大文件、旧日志、临时文件,还能预测磁盘满的时间,给出清理建议。
### 核心功能
- • 检查磁盘/Inode使用率,定位大目录(TOP10)
- • 查找超1G的大文件(可修改阈值)
- • 检查30天前未清理的旧日志
- • 清理/tmp目录下7天未使用的临时文件
- • 检查磁盘IO等待(避免IO过高导致卡顿)
### 使用步骤
1. 1\. 复制代码保存为 `disk_space_check.sh`
2. 2\. 赋予权限: `chmod +x disk_space_check.sh`
3. 3\. 执行:`./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 "$@"
```
### 新手避坑
1. 1\. **iostat缺失** :提示 `iostat: command not found` 时,执行 `yum install sysstat` (CentOS)或 `apt install sysstat` (Ubuntu)。
2. 2\. **清理谨慎** :执行“清理建议”中的命令前,先确认文件是否有用(比如 `find /tmp -type f -atime +7` 先查看,再删)。
## 脚本3-7:核心脚本(精简版,重点标配置和步骤)
### 脚本3:网络连接检查脚本
#### 用途
检查端口监听、TCP连接状态(比如TIME\_WAIT过多)、网络连通性(DNS/网关/外网)。
#### 使用步骤
1. 1\. 保存为 `network_check.sh` ,赋予权限: `chmod +x network_check.sh`
2. 2\. 执行:`./network_check.sh`
3. 3\. 新手改配置区: `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汇总报告(带颜色,可浏览器打开)。
#### 新手使用步骤
1. 1\. 准备服务器列表文件 `servers.txt` (格式如下):
```
# Web服务器
192.168.1.10
192.168.1.11
# 数据库服务器
192.168.1.30
```
2. 2\. 改配置区(SSH信息):
```
SSH_USER="root" # SSH用户名
SSH_KEY="~/.ssh/id_rsa" # SSH私钥路径(免密登录用)
CONCURRENT=10 # 并发数(同时检查10台)
CHECK_SCRIPT="system_health_check.sh" # 要批量执行的脚本
```
3. 3\. 执行:`./batch_check_scheduler.sh` ,报告存 `/var/log/batch_check_xxx/` ,打开 `summary.html` 看汇总。
## 新手必备总结
1. 1\. **常用命令**
- • 赋予脚本权限: `chmod +x 脚本名.sh`
- • 执行脚本:`./脚本名.sh` (root用户用 `sudo ./脚本名.sh` )
- • 定时执行: `crontab -e` ,添加 `0 8 * * * /path/to/脚本名.sh` (每天8点)
- • 查看报告: `cat /var/log/脚本名_20251022_083000.log`
3. 2\. **巡检频率建议**
- • 系统健康(脚本1):每天1次(早8点)
- • 磁盘检查(脚本2):每天1次
- • 进程检查(脚本4):核心业务每小时1次
- • 安全检查(脚本5):每周1次
- • 批量巡检(脚本7):集群每天1次
5. 3\. **避坑总览**
- • 所有脚本尽量用root执行,否则检查不完整
- • 命令缺失时,根据提示安装依赖(如 `yum install net-tools sysstat` )
- • 修改配置区时,路径、账户、密码要和实际环境一致
- • 清理文件前,先查看(如 `find /tmp -type f -atime +7` )再删除
素材来源官方媒体/网络新闻
内容含AI生成图片,注意甄别
继续滑动看下一个
python小甲鱼
向上滑动看下一个