#!/bin/bash # Linux系统巡检脚本 # 支持: CentOS 7/8, Ubuntu 18.04/20.04/22.04, Debian 9/10/11 set -e TIMESTAMP=$(date +"%Y%m%d_%H%M%S") REPORT_TIME=$(date +"%Y-%m-%d %H:%M:%S") OUTPUT_FILE="/tmp/linux_check_${TIMESTAMP}.txt" # 检测操作系统 if [ -f /etc/os-release ]; then . /etc/os-release OS=$ID OS_VERSION=$VERSION_ID else echo "无法检测操作系统版本" exit 1 fi # 生成报告 { echo "Linux系统巡检报告" echo "====================" echo "巡检时间: $REPORT_TIME" echo "" # 系统信息 echo "【系统信息】" echo "主机名: $(hostname)" echo "操作系统: $PRETTY_NAME" echo "内核: $(uname -r)" if systemd-detect-virt -q 2>/dev/null; then echo "运行环境: 虚拟机 ($(systemd-detect-virt))" else echo "运行环境: 物理机" fi echo "" # 运行时间 echo "【运行时间】" UPTIME_SECONDS=$(cat /proc/uptime | awk '{print $1}' | cut -d. -f1) UPTIME_DAYS=$((UPTIME_SECONDS / 86400)) UPTIME_HOURS=$(((UPTIME_SECONDS % 86400) / 3600)) echo "已运行: ${UPTIME_DAYS}天 ${UPTIME_HOURS}小时" echo "" # CPU信息 echo "【CPU信息】" CPU_CORES=$(nproc) CPU_USAGE=$(top -bn1 | grep "Cpu(s)" | sed "s/.*, *\([0-9.]*\)%* id.*/\1/" | awk '{print 100 - $1}') echo "核心数: $CPU_CORES" echo "当前使用率: ${CPU_USAGE}%" echo "" # 内存信息 echo "【内存信息】" MEM_TOTAL=$(free -b | grep Mem | awk '{print $2}') MEM_USED=$(free -b | grep Mem | awk '{print $3}') MEM_USAGE_PERCENT=$(awk "BEGIN {printf \"%.1f\", ($MEM_USED / $MEM_TOTAL) * 100}") echo "总内存: $(numfmt --to=iec $MEM_TOTAL)" echo "已用: $(numfmt --to=iec $MEM_USED) (${MEM_USAGE_PERCENT}%)" echo "" # 磁盘信息 - 修复版本 echo "【磁盘信息】" df -h -x tmpfs -x devtmpfs -x cdrom | tail -n +2 | while read -r filesystem size used avail use_percent mount; do # 提取百分比数字 use_num=$(echo "$use_percent" | sed 's/%//') if [ -n "$use_num" ] && [ "$use_num" -eq "$use_num" ] 2>/dev/null; then if [ "$use_num" -gt 90 ]; then echo "$mount: 警告 (${use_percent})" elif [ "$use_num" -gt 80 ]; then echo "$mount: 注意 (${use_percent})" else echo "$mount: 正常 (${use_percent})" fi else echo "$mount: 信息 (${use_percent})" fi done echo "" # 网络信息 echo "【网络信息】" ip -4 addr show | grep -E "^[0-9]+:|inet " | while read -r line; do if echo "$line" | grep -q "^[0-9]"; then IFACE=$(echo "$line" | awk -F: '{print $2}' | xargs) echo "$IFACE:" elif echo "$line" | grep -q "inet "; then IP=$(echo "$line" | awk '{print $2}' | cut -d/ -f1) echo " $IP" fi done echo "" # 进程信息 - 修复版本(按RSS实际内存排序) echo "【进程信息】" echo "内存占用Top 5 (RSS):" ps aux --sort=-rss | head -6 | tail -5 | awk '{printf " %s: %s (%.1f%%)\n", $11, $6, $4}' echo "" # 关键服务 echo "【关键服务】" for service in sshd crond network firewalld; do if systemctl is-active --quiet $service 2>/dev/null; then echo "$service: 运行中" else echo "$service: 未运行" fi done echo "" # 更新检查 echo "【系统更新】" if [ "$OS" = "ubuntu" ] || [ "$OS" = "debian" ]; then UPDATES=$(apt list --upgradable 2>/dev/null | grep -v "^Listing" | wc -l) echo "可更新包: $UPDATES 个" elif [ "$OS" = "centos" ] || [ "$OS" = "rhel" ] || [ "$OS" = "ol" ]; then # CentOS/RHEL使用yum或dnf if command -v dnf &> /dev/null; then UPDATES=$(dnf check-update --quiet 2>/dev/null | grep -v "^$" | wc -l) else UPDATES=$(yum check-update --quiet 2>/dev/null | grep -v "^$" | wc -l) fi echo "可更新包: $UPDATES 个" else echo "未知的包管理器" fi echo "" # 错误日志 echo "【错误日志】" journalctl -p err -n 5 --no-pager 2>/dev/null | while read -r line; do echo " $line" done echo "" echo "报告完成" } > "$OUTPUT_FILE" cat "$OUTPUT_FILE" # 添加负载检查 echo "【系统负载】" LOAD=$(uptime | awk -F'load average:' '{print $2}') echo "平均负载: $LOAD" # 添加TCP连接状态统计 echo "【连接状态】" ss -s | grep -E "(TCP| estab| closed| syn)" # 添加僵尸进程检查 echo "【僵尸进程】" ZOMBIES=$(ps aux | awk '$8=="Z"' | wc -l) if [ "$ZOMBIES" -gt 0 ]; then echo "发现 $ZOMBIES 个僵尸进程" ps aux | awk '$8=="Z"' else echo "无僵尸进程" fi |