当前位置:首页>Linux>linux系统自动化巡检脚本

linux系统自动化巡检脚本

  • 2026-10-11 08:40:02
linux系统自动化巡检脚本

1. 系统信息

  • 主机名:显示服务器hostname

  • 操作系统:读取 /etc/os-release 获取发行版名称和版本

  • 内核版本:uname -r 输出

  • 运行环境:检测是物理机还是虚拟机(支持VMware/KVM/Xen等)

2. 运行时间

  • 计算系统已运行天数和小时数

  • 数据来源:/proc/uptime

3. CPU信息

  • 核心数:逻辑CPU数量

  • 使用率:通过 top 命令采样计算(100% - 空闲率)

4. 内存信息

  • 总内存:物理内存总量

  • 已用内存:实际使用内存(含缓存)

  • 使用率百分比:自动计算并格式化显示

5. 磁盘信息

  • 排除 tmpfs、devtmpfs、cdrom 等虚拟设备

  • 检查所有物理挂载点使用率

  • 分级告警:

    • ≤80%:正常

    • 80%-90%:注意(黄色)

    • >90%:警告(红色)

6. 网络信息

  • 列出所有网络接口名称

  • 显示IPv4地址(排除127.0.0.1回环地址)

7. 进程信息

  • Top 5内存占用进程:显示进程名、RSS物理内存、内存占用百分比

8. 关键服务检查

  • 检查以下服务运行状态:

    • sshd:SSH远程连接服务

    • crond:定时任务服务

    • network:网络服务

    • firewalld:防火墙服务

9. 系统更新检查

  • Ubuntu/Debian:使用 apt list --upgradable 统计可更新包数量

  • CentOS/RHEL:使用 yum/dnf check-update 统计

10. 错误日志

  • 显示最近5条系统错误日志(journalctl -p err)

  • 包含时间戳和错误详情

11. 脚本内容:

#!/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

保存脚本,给执行权限,直接运行:

chmod +x linuxcheck.sh

sh linuxcheck.sh

12. 定时自动巡检

建议设置定时任务,每天自动执行并发送报告:

# 编辑定时任务crontab-e# 添加以下行(每天8点执行并发送邮件)08 * * * /root/linuxcheck.sh | mail -s"服务器巡检报告-$(date +%Y%m%d)" admin@yourcompany.com

点这里👇关注我,记得标星呀~

感谢你的分享,点赞,在看三连

最新文章

随机文章