linux服务器常用组件巡检脚本
关键特点展示
清晰的告警系统:
🟢 绿色:正常状态
🟡 黄色:需要注意的问题(磁盘使用率84%)
🔴 红色:严重警告
完整的Docker信息:
容器状态和运行时间
中间件详细版本
资源使用情况统计
端口映射信息
实用的摘要报告:
快速识别问题数量
Docker运行状态概览
日志文件位置提示
#!/bin/bash# 系统巡检脚本
# 功能:检查系统盘、数据盘、CPU、内存、端口、Docker服务状态和中间件版本# 颜色定义
RED='\033[0;31m'
GREEN='\033[0;32m'
YELLOW='\033[1;33m'
BLUE='\033[0;34m'
PURPLE='\033[0;35m'
CYAN='\033[0;36m'
NC='\033[0m' # No Color# 日志文件
LOG_FILE="/tmp/system_inspection_$(date +%Y%m%d_%H%M%S).log"# 函数:打印带颜色的输出
print_color() {local color=$1local message=$2echo -e "${color}${message}${NC}" | tee -a "$LOG_FILE"
}# 函数:记录日志
log() {local message=$1echo "$(date '+%Y-%m-%d %H:%M:%S') - $message" | tee -a "$LOG_FILE"
}# 函数:检查系统基本信息
check_system_info() {log "=== 系统基本信息检查 ==="echo "主机名: $(hostname)" | tee -a "$LOG_FILE"echo "操作系统: $(cat /etc/os-release | grep PRETTY_NAME | cut -d= -f2 | tr -d '\"')" | tee -a "$LOG_FILE"echo "内核版本: $(uname -r)" | tee -a "$LOG_FILE"echo "系统运行时间: $(uptime | awk '{print $3,$4}' | sed 's/,//')" | tee -a "$LOG_FILE"echo | tee -a "$LOG_FILE"
}# 函数:检查OpenSSH版本
check_openssh_version() {log "=== OpenSSH版本检查 ==="if command -v ssh >/dev/null 2>&1; thenlocal ssh_version=$(ssh -V 2>&1 | awk '{print $1}')echo "OpenSSH版本: $ssh_version" | tee -a "$LOG_FILE"# 检查是否有已知漏洞版本local version_num=$(echo $ssh_version | grep -oE '[0-9]+\.[0-9]+' | head -1)if [ -n "$version_num" ]; thenif (( $(echo "$version_num < 7.4" | bc -l 2>/dev/null) )); thenprint_color "$RED" "警告: OpenSSH版本较旧,可能存在安全漏洞!"elseprint_color "$GREEN" "OpenSSH版本较新"fifielseecho "OpenSSH 未安装" | tee -a "$LOG_FILE"fiecho | tee -a "$LOG_FILE"
}# 函数:检查OpenSSL版本
check_openssl_version() {log "=== OpenSSL版本检查 ==="if command -v openssl >/dev/null 2>&1; thenlocal openssl_version=$(openssl version)echo "OpenSSL版本: $openssl_version" | tee -a "$LOG_FILE"# 检查是否有已知漏洞版本local version_num=$(echo $openssl_version | grep -oE '[0-9]+\.[0-9]+\.[0-9]+' | head -1)if [ -n "$version_num" ]; thenif (( $(echo "$version_num < 1.1.1" | bc -l 2>/dev/null) )); thenprint_color "$RED" "警告: OpenSSL版本较旧,建议升级到1.1.1或更高版本!"elseprint_color "$GREEN" "OpenSSL版本较新"fifielseecho "OpenSSL 未安装" | tee -a "$LOG_FILE"fiecho | tee -a "$LOG_FILE"
}# 函数:检查CPU使用率
check_cpu() {log "=== CPU使用率检查 ==="local cpu_usage=$(top -bn1 | grep "Cpu(s)" | awk '{print $2}' | cut -d'%' -f1)echo "CPU使用率: ${cpu_usage}%" | tee -a "$LOG_FILE"if (( $(echo "$cpu_usage > 80" | bc -l 2>/dev/null) )); thenprint_color "$RED" "警告: CPU使用率过高!"elif (( $(echo "$cpu_usage > 60" | bc -l 2>/dev/null) )); thenprint_color "$YELLOW" "注意: CPU使用率较高"elseprint_color "$GREEN" "CPU使用率正常"fiecho | tee -a "$LOG_FILE"
}# 函数:检查内存使用情况
check_memory() {log "=== 内存使用情况检查 ==="echo "内存信息:" | tee -a "$LOG_FILE"free -h | tee -a "$LOG_FILE"local total_mem=$(free | grep Mem | awk '{print $2}')local used_mem=$(free | grep Mem | awk '{print $3}')local mem_usage=0if [ $total_mem -gt 0 ]; thenmem_usage=$(echo "scale=2; $used_mem * 100 / $total_mem" | bc 2>/dev/null || echo "0")fiecho "内存使用率: ${mem_usage}%" | tee -a "$LOG_FILE"if (( $(echo "$mem_usage > 80" | bc -l 2>/dev/null) )); thenprint_color "$RED" "警告: 内存使用率过高!"elif (( $(echo "$mem_usage > 60" | bc -l 2>/dev/null) )); thenprint_color "$YELLOW" "注意: 内存使用率较高"elseprint_color "$GREEN" "内存使用率正常"fiecho | tee -a "$LOG_FILE"
}# 函数:检查磁盘空间
check_disk() {log "=== 磁盘空间检查 ==="echo "系统盘和数据盘使用情况:" | tee -a "$LOG_FILE"df -h | grep -E "^/dev/" | while read line; dolocal usage=$(echo $line | awk '{print $5}' | cut -d'%' -f1)local mount_point=$(echo $line | awk '{print $6}')local size=$(echo $line | awk '{print $2}')local used=$(echo $line | awk '{print $3}')local avail=$(echo $line | awk '{print $4}')echo "挂载点: $mount_point, 总大小: $size, 已用: $used, 可用: $avail, 使用率: $usage%" | tee -a "$LOG_FILE"if [ $usage -gt 90 ]; thenprint_color "$RED" "警告: $mount_point 磁盘使用率超过90%!"elif [ $usage -gt 80 ]; thenprint_color "$YELLOW" "注意: $mount_point 磁盘使用率超过80%"elseprint_color "$GREEN" "$mount_point 磁盘空间正常"fidoneecho | tee -a "$LOG_FILE"
}# 函数:检查监听端口
check_ports() {log "=== 监听端口检查 ==="echo "当前监听的端口:" | tee -a "$LOG_FILE"if command -v ss >/dev/null 2>&1; thenss -tuln | grep LISTEN | tee -a "$LOG_FILE"elsenetstat -tuln | grep LISTEN | tee -a "$LOG_FILE"fiecho | tee -a "$LOG_FILE"
}# 函数:检查Docker服务状态
check_docker() {log "=== Docker服务检查 ==="# 检查Docker是否安装if ! command -v docker >/dev/null 2>&1; thenecho "Docker 未安装" | tee -a "$LOG_FILE"returnfi# 检查Docker服务状态if systemctl is-active --quiet docker; thenprint_color "$GREEN" "Docker服务: 运行中"echo "Docker版本: $(docker --version | cut -d' ' -f3 | tr -d ',')" | tee -a "$LOG_FILE"# 检查Docker Composeif command -v docker-compose >/dev/null 2>&1; thenecho "Docker Compose版本: $(docker-compose --version | cut -d' ' -f3 | tr -d ',')" | tee -a "$LOG_FILE"fi# 检查Docker容器数量local total_containers=$(docker ps -q | wc -l)local running_containers=$(docker ps -q --filter status=running | wc -l)echo "Docker容器: 总数量 $total_containers, 运行中 $running_containers" | tee -a "$LOG_FILE"elseprint_color "$RED" "Docker服务: 未运行"returnfiecho | tee -a "$LOG_FILE"# 检查Docker容器状态check_docker_containers
}# 函数:检查Docker容器状态
check_docker_containers() {log "=== Docker容器详细状态 ==="local containers=$(docker ps --format "{{.Names}}" 2>/dev/null)if [ -z "$containers" ]; thenecho "没有运行中的Docker容器" | tee -a "$LOG_FILE"returnfiecho "运行中的Docker容器:" | tee -a "$LOG_FILE"docker ps --format "table {{.Names}}\t{{.Image}}\t{{.Status}}\t{{.Ports}}" 2>/dev/null | tee -a "$LOG_FILE"echo | tee -a "$LOG_FILE"# 检查Docker中间件版本check_docker_middleware_versions
}# 函数:检查Docker中间件版本
check_docker_middleware_versions() {log "=== Docker中间件版本检查 ==="local containers=$(docker ps --format "{{.Names}}:{{.Image}}" 2>/dev/null)if [ -z "$containers" ]; thenecho "没有运行中的Docker容器" | tee -a "$LOG_FILE"returnfiecho "中间件版本信息:" | tee -a "$LOG_FILE"echo "----------------------------------------" | tee -a "$LOG_FILE"IFS=$'\n'for container in $containers; dolocal name=$(echo $container | cut -d':' -f1)local image=$(echo $container | cut -d':' -f2)local image_version=$(echo $image | awk -F':' '{print $2}')[ -z "$image_version" ] && image_version="latest"# 根据容器名称和镜像名称判断中间件类型local service_type=""local version_info=""# 判断中间件类型if echo "$name$image" | grep -qi "nginx"; thenservice_type="Nginx"version_info=$(docker exec $name nginx -v 2>&1 2>/dev/null | head -1 || echo "镜像版本: $image_version")elif echo "$name$image" | grep -qi "redis"; thenservice_type="Redis"version_info=$(docker exec $name redis-server --version 2>/dev/null | head -1 || echo "镜像版本: $image_version")elif echo "$name$image" | grep -qi "postgres"; thenservice_type="PostgreSQL"version_info=$(docker exec $name postgres --version 2>/dev/null | head -1 || echo "镜像版本: $image_version")elif echo "$name$image" | grep -qi "mysql"; thenservice_type="MySQL"version_info=$(docker exec $name mysql --version 2>/dev/null | head -1 || echo "镜像版本: $image_version")elif echo "$name$image" | grep -qi "mongo"; thenservice_type="MongoDB"version_info=$(docker exec $name mongod --version 2>/dev/null | head -1 || echo "镜像版本: $image_version")elseservice_type="其他服务"version_info="镜像版本: $image_version"fi# 根据服务类型使用不同颜色输出case $service_type in"Nginx")print_color "$PURPLE" "$service_type [$name]: $version_info";;"Redis")print_color "$RED" "$service_type [$name]: $version_info";;"PostgreSQL")print_color "$BLUE" "$service_type [$name]: $version_info";;"MySQL")print_color "$YELLOW" "$service_type [$name]: $version_info";;"MongoDB")print_color "$GREEN" "$service_type [$name]: $version_info";;*)echo "$service_type [$name]: $version_info" | tee -a "$LOG_FILE";;esacdoneunset IFSecho | tee -a "$LOG_FILE"
}# 函数:检查关键系统服务状态(只检查必要的)
check_essential_services() {log "=== 关键系统服务状态检查 ==="# 只检查真正关键的系统服务,不检查Docker运行的中间件local essential_services=("docker" "ssh" "sshd" "systemd-journald" "rsyslog" "crond" "cron")for service in "${essential_services[@]}"; do# 检查服务是否存在if systemctl list-unit-files "${service}.service" >/dev/null 2>&1; thenlocal status=$(systemctl is-active "${service}.service" 2>/dev/null || echo "inactive")local enabled=$(systemctl is-enabled "${service}.service" 2>/dev/null || echo "unknown")if [ "$status" = "active" ]; thenprint_color "$GREEN" "系统服务 $service: 运行中 (启用状态: $enabled)"elseprint_color "$YELLOW" "系统服务 $service: 未运行 (启用状态: $enabled)"fifidone# 特别说明Docker运行的中间件if command -v docker >/dev/null 2>&1 && systemctl is-active --quiet docker; thenlocal container_count=$(docker ps -q | wc -l)print_color "$CYAN" "注: 中间件服务(Nginx/Redis/PostgreSQL等)通过Docker运行,当前有 ${container_count} 个容器"fiecho | tee -a "$LOG_FILE"
}# 函数:检查Docker资源使用情况
check_docker_resources() {log "=== Docker资源使用情况 ==="if ! command -v docker >/dev/null 2>&1 || ! systemctl is-active --quiet docker; thenecho "Docker未运行,跳过资源检查" | tee -a "$LOG_FILE"returnfiecho "Docker系统资源使用:" | tee -a "$LOG_FILE"docker system df 2>/dev/null | tee -a "$LOG_FILE"echo | tee -a "$LOG_FILE"# 检查容器资源使用echo "容器资源使用情况:" | tee -a "$LOG_FILE"docker stats --no-stream --format "table {{.Name}}\t{{.CPUPerc}}\t{{.MemUsage}}\t{{.MemPerc}}\t{{.NetIO}}\t{{.BlockIO}}" 2>/dev/null | tee -a "$LOG_FILE"echo | tee -a "$LOG_FILE"
}# 函数:生成摘要报告
generate_summary() {log "=== 检查摘要 ==="echo "检查完成时间: $(date)" | tee -a "$LOG_FILE"echo "详细日志请查看: $LOG_FILE" | tee -a "$LOG_FILE"# Docker相关统计if command -v docker >/dev/null 2>&1 && systemctl is-active --quiet docker; thenlocal running_containers=$(docker ps -q | wc -l)local total_containers=$(docker ps -a -q | wc -l)echo "Docker状态: 运行中容器 ${running_containers}/${total_containers}" | tee -a "$LOG_FILE"fi# 检查是否有严重问题local warnings=$(grep -c "警告" "$LOG_FILE" 2>/dev/null || true)local notices=$(grep -c "注意" "$LOG_FILE" 2>/dev/null || true)if [ $warnings -gt 0 ]; thenprint_color "$RED" "发现 $warnings 个警告问题,请及时处理!"fiif [ $notices -gt 0 ]; thenprint_color "$YELLOW" "发现 $notices 个需要注意的问题"fiif [ $warnings -eq 0 ] && [ $notices -eq 0 ]; thenprint_color "$GREEN" "所有检查项正常"fi
}# 主函数
main() {echo "开始系统巡检..."echo "检查时间: $(date)"echo "日志文件: $LOG_FILE"echo "========================================="check_system_infocheck_openssh_versioncheck_openssl_versioncheck_cpucheck_memorycheck_diskcheck_portscheck_dockercheck_docker_resourcescheck_essential_servicesgenerate_summaryechoprint_color "$BLUE" "巡检完成!详细报告已保存到: $LOG_FILE"
}# 执行主函数
main
# 授权
chmod +x system_inspection.sh
# 运行
./system_inspection.sh
日志文件内容示例
同时生成的日志文件 /tmp/system_inspection_20241219_143025.log 内容如下:
2024-12-19 14:30:25 - === 系统基本信息检查 ===
主机名: server-prod-01
操作系统: Ubuntu 20.04.5 LTS
内核版本: 5.4.0-150-generic
系统运行时间: 45 days2024-12-19 14:30:25 - === OpenSSH版本检查 ===
OpenSSH版本: OpenSSH_8.2p1
OpenSSH版本较新2024-12-19 14:30:25 - === OpenSSL版本检查 ===
OpenSSL版本: OpenSSL 1.1.1f 31 Mar 2020
OpenSSL版本较新2024-12-19 14:30:25 - === CPU使用率检查 ===
CPU使用率: 24.5%
CPU使用率正常2024-12-19 14:30:25 - === 内存使用情况检查 ===
内存信息:total used free shared buff/cache available
Mem: 15Gi 8.2Gi 2.1Gi 1.2Gi 5.2Gi 5.8Gi
Swap: 2.0Gi 0.0Ki 2.0Gi
内存使用率: 54.66%
内存使用率正常2024-12-19 14:30:25 - === 磁盘空间检查 ===
系统盘和数据盘使用情况:
挂载点: /, 总大小: 98G, 已用: 45G, 可用: 48G, 使用率: 49%
/ 磁盘空间正常
挂载点: /data, 总大小: 1.8T, 已用: 1.2T, 可用: 521G, 使用率: 70%
/data 磁盘空间正常
挂载点: /backup, 总大小: 500G, 已用: 420G, 可用: 80G, 使用率: 84%
注意: /backup 磁盘使用率超过80%2024-12-19 14:30:25 - === 监听端口检查 ===
当前监听的端口:
State Recv-Q Send-Q Local Address:Port Peer Address:Port
LISTEN 0 128 0.0.0.0:22 0.0.0.0:*
LISTEN 0 128 *:80 *:*
LISTEN 0 128 *:443 *:*
LISTEN 0 128 *:6379 *:*
LISTEN 0 128 *:5432 *:*
LISTEN 0 128 *:8080 *:*
LISTEN 0 128 [::]:22 [::]:* 2024-12-19 14:30:25 - === Docker服务检查 ===
Docker服务: 运行中
Docker版本: 20.10.21
Docker Compose版本: 2.12.2
Docker容器: 总数量 6, 运行中 62024-12-19 14:30:25 - === Docker容器详细状态 ===
运行中的Docker容器:
NAMES IMAGE STATUS PORTS
nginx-proxy nginx:1.22-alpine Up 2 weeks 0.0.0.0:80->80/tcp, 0.0.0.0:443->443/tcp
redis-cache redis:7.0-alpine Up 2 weeks 0.0.0.0:6379->6379/tcp
postgres-db postgres:14-alpine Up 2 weeks 0.0.0.0:5432->5432/tcp
app-backend node:18-alpine Up 2 weeks 0.0.0.0:8080->3000/tcp
mongodb-data mongo:5.0 Up 3 days 27017/tcp
jenkins-ci jenkins/jenkins:lts Up 4 weeks 0.0.0.0:8081->8080/tcp2024-12-19 14:30:25 - === Docker中间件版本检查 ===
中间件版本信息:
----------------------------------------
Nginx [nginx-proxy]: nginx version: nginx/1.22.1
Redis [redis-cache]: Redis server v=7.0.5 sha=00000000:0 malloc=jemalloc-5.2.1 bits=64 build=abcdef1234567890
PostgreSQL [postgres-db]: postgres (PostgreSQL) 14.5
其他服务 [app-backend]: 镜像版本: 18-alpine
MongoDB [mongodb-data]: db version v5.0.14
其他服务 [jenkins-ci]: 镜像版本: lts2024-12-19 14:30:25 - === Docker资源使用情况 ===
Docker系统资源使用:
TYPE TOTAL ACTIVE SIZE RECLAIMABLE
Images 15 6 4.2GB 1.1GB (26%)
Containers 6 6 2.1GB 0B (0%)
Local Volumes 8 8 5.7GB 0B (0%)
Build Cache 58 0 892MB 892MB容器资源使用情况:
NAME CPU % MEM USAGE / LIMIT MEM % NET I/O BLOCK I/O
nginx-proxy 0.15% 45.32MiB / 15.64GiB 0.28% 1.45GB / 2.1GB 0B / 0B
redis-cache 0.08% 12.45MiB / 15.64GiB 0.08% 245MB / 189MB 0B / 0B
postgres-db 0.23% 156.78MiB / 15.64GiB 0.98% 89.4MB / 156MB 0B / 0B
app-backend 1.45% 324.56MiB / 15.64GiB 2.03% 456MB / 678MB 0B / 0B
mongodb-data 0.34% 89.23MiB / 15.64GiB 0.56% 12.4MB / 8.7MB 0B / 0B
jenkins-ci 0.67% 512.34MiB / 15.64GiB 3.20% 78.9MB / 45.6MB 0B / 0B2024-12-19 14:30:25 - === 关键系统服务状态检查 ===
系统服务 docker: 运行中 (启用状态: enabled)
系统服务 ssh: 运行中 (启用状态: enabled)
系统服务 cron: 运行中 (启用状态: enabled)
注: 中间件服务(Nginx/Redis/PostgreSQL等)通过Docker运行,当前有 6 个容器2024-12-19 14:30:25 - === 检查摘要 ===
检查完成时间: 2024年12月19日 星期四 14:30:26 CST
详细日志请查看: /tmp/system_inspection_20241219_143025.log
Docker状态: 运行中容器 6/6
注意: /backup 磁盘使用率超过80%
发现 1 个需要注意的问题

