非常实用的linux操作系统一键巡检脚本

[root@localhost ~]# chmod +x system_check.sh 
[root@localhost ~]# ./system_check.sh 
[root@localhost ~]# cat /root/check_log/check-20250227.txt

脚本内容:

#!/bin/bash
# @Author: zhh
# beseem CentOS6.X CentOS7.X
# date: 20250224

# 检查是否以root用户执行脚本
if [ $(id -u) -gt 0 ]; then
    echo "请用root用户执行此脚本!"
    exit 1
fi

# 定义日志目录
LOG_DIR="/root/check_log"

# 创建日志目录
if [ ! -d "$LOG_DIR" ]; then
    mkdir -p "$LOG_DIR"
    echo "$LOG_DIR 检查日志存放目录创建成功"
else
    echo "$LOG_DIR 检查日志存放目录已存在"
fi

# 定义结果文件
RESULT_FILE="$LOG_DIR/check-$(date +%Y%m%d).txt"

# 系统信息检查函数
function getSystem() {
    echo -e "\n\n############################ 系统信息检查 ############################"
    local DEFAULT_LANG=${LANG}
    local OS=$(uname -o)
    local RELEASE=$(cat /etc/redhat-release 2>/dev/null)
    local KERNEL=$(uname -r)
    local HOSTNAME=$(uname -n)
    local NOW_DATE=$(date +'%F %T')
    local LAST_REBOOT=$(who -b | awk '{print $3,$4}')
    local UPTIME=$(uptime | sed 's/.*up \([^,]*\), .*/\1/')

    echo " 语言环境: $DEFAULT_LANG"
    echo " 系统: $OS"
    echo " 发行版本: $RELEASE"
    echo " 内核: $KERNEL"
    echo " 主机名: $HOSTNAME"
    echo " 当前时间: $NOW_DATE"
    echo " 最后启动: $LAST_REBOOT"
    echo " 运行时间: $UPTIME"
}

# CPU检查函数
function getCpu() {
    echo -e "\n\n############################ CPU检查 ############################"
    local PHYSICAL_CPUS=$(grep "physical id" /proc/cpuinfo | sort | uniq | wc -l)
    local VIRT_CPUS=$(grep "processor" /proc/cpuinfo | wc -l)
    local CPU_KERNELS=$(grep "cores" /proc/cpuinfo | uniq | awk -F ': ' '{print $2}')
    local CPU_TYPE=$(grep "model name" /proc/cpuinfo | awk -F ': ' '{print $2}' | sort | uniq)
    local CPU_HZ=$(cat /proc/cpuinfo | grep "cpu MHz" | uniq | awk -F ':' '{sub(/ /,"",$2);printf "%s MHz\n",$2}')
    local CPU_ARCH=$(uname -m)
    local CPU_USAGE=$(cat /proc/loadavg | awk '{print $1}')

    echo "物理CPU个数: $PHYSICAL_CPUS"
    echo "逻辑CPU个数: $VIRT_CPUS"
    echo "每CPU核心数: $CPU_KERNELS"
    echo "CPU型号: $CPU_TYPE"
    echo "CPU频率: $CPU_HZ"
    echo "CPU架构: $CPU_ARCH"
    echo "CPU使用率: ${CPU_USAGE}%"
}

# 内存检查函数
function getMemory() {
    echo -e "\n\n############################ 内存检查 ############################"
    local MEMORY_USED=$(awk '/MemTotal/{total=$2}/MemFree/{free=$2}END{print (total-free)/1024/1024}' /proc/meminfo)
    local MEMORY_TOTAL=$(awk '/MemTotal/{total=$2}END{print (total)/1024/1024}' /proc/meminfo)
    local MEMORY_USAGE=$(awk '/MemTotal/{total=$2}/MemFree/{free=$2}END{printf "%.2f", (total-free)/total*100}' /proc/meminfo)

    echo "已使用内存/全部内存: ${MEMORY_USED}GB/${MEMORY_TOTAL}GB"
    echo "内存使用率: ${MEMORY_USAGE}%"
}

# 硬盘检查函数
function getDisk() {
    echo -e "\n\n############################ 硬盘检查 ############################"
    local DISK_COUNT=$(lsblk | awk '/disk/{print $1}' | wc -l)
    echo "硬盘数量: ${DISK_COUNT}个"
    echo "硬盘分区情况: "
    df -hTP | sort | grep -E "/sd|/mapper" | awk '{print ($1 "\t\n" "  文件系统:" $2 "  合计:" $3 "  已用:" $4 "  剩余:" $5 "  使用率:" $6 "  挂载点:" $7)}'

    if command -v smartctl &> /dev/null; then
        echo "smartctl工具已安装,可以进行硬盘健康检测: "
        for i in $(lsblk | awk '/disk/{print $1}'); do
            echo "硬盘 $i: $(smartctl -H /dev/$i | grep -Ei "OK|PASSED|FAILED|Failure|Failed")"
        done
    else
        echo "smartctl工具未安装,无法进行硬盘健康检测"
    fi
}

# 网络检查函数
function getNetwork() {
    echo -e "\n\n############################ 网络检查 ############################"
    local NETWORK_DEVICES=$(cat /proc/net/dev | awk 'NR>2 && $1 !~ /lo/ {sub(/:/,"");print $1}')
    for i in $NETWORK_DEVICES; do
        local STATUS=$(ip link show $i | awk 'NR==1{print $9}')
        local RX=$(ethtool -g $i | grep "RX:" | tail -1 | awk '{print $2}')
        local TX=$(ethtool -g $i | grep "TX:" | tail -1 | awk '{print $2}')
        local MAC_INFO=$(ip link show $i | grep link | awk '{print $2}')
        local PRIVATE_IP=$(ip addr show $i | awk '/inet.*global/ {print gensub(/(.*)\/(.*)/, "\\1", "g", $2)}')
        local GATEWAY=$(ip route | grep default | awk '{print $3}')

        echo "网卡:$i  状态: $STATUS RX: $RX TX: $TX"
        echo "MAC地址: $MAC_INFO"
        echo "IP地址: $PRIVATE_IP"
        if [ -n "$GATEWAY" ]; then
            echo "网关地址: $GATEWAY"
            echo "网关连接情况: $(ping -c 4 -i 0.5 -W 3 $GATEWAY &>/dev/null && echo '正常通信' || echo '无法通信')"
        else
            echo "未找到网关地址"
        fi
        echo "外网连接情况: $(ping -c 4 -i 0.5 -W 3 baidu.com &>/dev/null && echo '正常通信' || echo '无法通信')"
    done

    local LISTEN_PORT=$(ss -tuln | grep LISTEN | awk '{print $5}' | awk -F: '{print $2$4}' | sort | uniq -d | tr '\n' ',' | sed 's/,$//')
    echo "系统运行的端口: $LISTEN_PORT"
}

# 检查函数
function check() {
    echo "Host Daily Check Script"
    getSystem
    getCpu
    getMemory
    getDisk
    getNetwork
}

# 执行检查并输出结果到文件
check > "$RESULT_FILE"
echo "检查结果:$RESULT_FILE"

非常实用的linux操作系统一键巡检脚本_第1张图片

你可能感兴趣的:(linux,linux,chrome,运维)