效果如下:

脚本代码如下:

#!/bin/bash


# 确保所需工具可被找到
export PATH=$PATH:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin


# 定义全局变量
system_facts=""
cpu_facts=""
mem_facts=""
disk_facts=""


# 获取系统信息
function get_system() {
    local hostname
    local os_pretty_name
    local kernel

    hostname=$(hostname 2>/dev/null)
    if [ $? -ne 0 ]; then
        echo "获取主机名失败" >&2
        hostname=""
    fi

    os_pretty_name=$(get_os_pretty_name)
    if [ $? -ne 0 ]; then
        echo "获取系统版本信息失败" >&2
        os_pretty_name=""
    fi

    kernel=$(uname -r 2>/dev/null)
    if [ $? -ne 0 ]; then
        echo "获取内核信息失败" >&2
        kernel=""
    fi

    system_facts=$(cat << EOF
    {
        "hostname": "${hostname}",
        "os_pretty_name": "${os_pretty_name}",
        "kernel": "${kernel}"
    }
EOF
    )
}


# 获取操作系统版本信息的辅助函数
function get_os_pretty_name() {
    awk '/^PRETTY_NAME=/' /etc/*-release 2>/dev/null | awk -F'=' '{gsub("\"","");print $2 }'
}


# 获取 CPU 信息
function get_cpu() {
    local cpu_physical_cores
    local one_minute_load
    local five_minutes_load
    local cpu_usage

    cpu_physical_cores=$(get_cpu_physical_cores)
    if [ $? -ne 0 ]; then
        echo "获取 CPU 物理核心数失败" >&2
        cpu_physical_cores=0
    fi


    local uptime_info=$(uptime | awk -F':' '{print $NF}' | sed 's/,//g')
    one_minute_load=$(echo "${uptime_info}" | awk '{print $1}')
    five_minutes_load=$(echo "${uptime_info}" | awk '{print $2}')


    if command -v iostat >/dev/null 2>&1; then
        cpu_usage=$(get_cpu_usage_from_iostat)
    else
        cpu_usage=$(get_cpu_usage_from_top)
    fi


    cpu_facts=$(cat << EOF
    {
        "cpuused": "${cpu_usage}%",
        "cpu_loadavg1": "${one_minute_load}",
        "cpu_loadavg5": "${five_minutes_load}"
    }
EOF
    )
}


# 获取 CPU 物理核心数的辅助函数
function get_cpu_physical_cores() {
    grep "^processor" /proc/cpuinfo | wc -l
}


# 从 iostat 获取 CPU 使用率
function get_cpu_usage_from_iostat() {
    iostat 1 2 | grep -A 1 avg-cpu | tail -1 | awk '{print 100 - $NF}'
}


# 从 top 获取 CPU 使用率
function get_cpu_usage_from_top() {
    local command
    command=$(top -bn 1 | grep Cpu | awk -F: '{print $2}' | sed 's/%/ %/g' | sed 's/,/ /g' | tail -1)
    echo "${command}" | awk '{print 100 - $7}'
}


# 获取内存信息
function get_mem() {
    local mem_info
    local mem_total_size
    local mem_free
    local buffers_cache_size
    local available_memory
    local used_memory
    local used_percentage


    mem_info=$(export LANG=en_US; free -m | grep -i mem)
    mem_total_size=$(echo "${mem_info}" | awk 'NR==1{print $2}')
    mem_free=$(echo "${mem_info}" | awk 'NR==1{print $4}')
    buffers_cache_size=$(echo "${mem_info}" | awk 'NR==1{print $6}')
    available_memory=$(export LANG=en_US; free -m | grep -A 1 available | awk 'NR==2{print $NF}')


    if [ -z "${available_memory}" ]; then
        used_memory=$((mem_total_size - mem_free - buffers_cache_size))
        used_percentage=$(awk -v used=${used_memory} -v total=${mem_total_size} 'BEGIN{printf "%.2f\n", 100 * used / total}')
    else
        used_memory=$((mem_total_size - available_memory))
        used_percentage=$(awk -v avail=${available_memory} -v total=${mem_total_size} 'BEGIN{printf "%.2f\n", 100 - (avail / total * 100)}')
    fi


    mem_facts=$(cat << EOF
    {
        "MemTotalSize": "${mem_total_size}M",
        "MemFree": "${mem_free}M",
        "Available": "${available_memory}M",
        "usedperc": "${used_percentage}%"
    }
EOF
    )
}


# 获取磁盘信息
function get_disk() {
    local root_disk_info
    local data_disk_info
    local root_total_disk
    local root_free_disk
    local root_usage_disk
    local data_total_disk
    local data_free_disk
    local data_usage_disk


    root_disk_info=$(df -HT | grep -w '/')
    data_disk_info=$(df -HT | grep -w '/data')


    if [ $(echo "${root_disk_info}" | grep -Ev "^$" | wc -l) -eq 1 ]; then
        root_total_disk=$(echo "${root_disk_info}" | awk '{print $3}')
        root_free_disk=$(echo "${root_disk_info}" | awk '{print $5}')
        root_usage_disk=$(echo "${root_disk_info}" | awk '{print $(NF-1)}')
    else
        root_total_disk=""
        root_free_disk=""
        root_usage_disk=""
    fi


    if [ $(echo "${data_disk_info}" | grep -Ev "^$" | wc -l) -eq 1 ]; then
        data_total_disk=$(echo "${data_disk_info}" | awk '{print $3}')
        data_free_disk=$(echo "${data_disk_info}" | awk '{print $4}')
        data_usage_disk=$(echo "${data_disk_info}" | awk '{print $(NF-1)}')
    else
        data_total_disk=""
        data_free_disk=""
        data_usage_disk=""
    fi


    disk_facts=$(cat << EOF
    {
        "root_total_disk": "${root_total_disk}",
        "root_free_disk": "${root_free_disk}",
        "root_usage_disk": "${root_usage_disk}",
        "data_total_disk": "${data_total_disk}",
        "data_free_disk": "${data_free_disk}",
        "data_usage_disk": "${data_usage_disk}"
    }
EOF
    )
}


# 主函数
function main() {
    get_system
    get_cpu
    get_mem
    get_disk


    check_facts=$(cat << EOF
    {
        "system": ${system_facts:-[]},
        "cpu": ${cpu_facts:-[]},
        "mem": ${mem_facts:-[]},
        "disk": ${disk_facts:-[]}
    }
EOF
    )
    echo "${check_facts:-[]}"
}


# 调用主函数
main

Logo

2万人民币佣金等你来拿,中德社区发起者X.Lab,联合德国优秀企业对接开发项目,领取项目得佣金!!!

更多推荐