如何编写系统信息仪表盘脚本

wen 实用脚本 3

本文目录导读:

如何编写系统信息仪表盘脚本

  1. 使用说明
  2. 功能特点
  3. 可选扩展功能

我来帮您编写一个系统信息仪表盘脚本,这是一个功能完整的Bash脚本,能实时显示系统核心信息:

#!/bin/bash
# ============================================
# 系统信息仪表盘脚本
# 显示CPU、内存、磁盘、网络等系统信息
# 适用于Linux系统
# ============================================
# 颜色定义
RED='\033[0;31m'
GREEN='\033[0;32m'
YELLOW='\033[1;33m'
BLUE='\033[0;34m'
PURPLE='\033[0;35m'
CYAN='\033[0;36m'
WHITE='\033[1;37m'
NC='\033[0m' # No Color
# 分隔线
LINE="=========================================="
# 打印带颜色的标题
print_title() {
    echo -e "${CYAN}$1${NC}"
    echo -e "${CYAN}$LINE${NC}"
}
# 显示系统信息
show_system_info() {
    print_title "系统信息"
    echo -e "${GREEN}主机名:${NC} $(hostname)"
    echo -e "${GREEN}操作系统:${NC} $(cat /etc/os-release | grep "PRETTY_NAME" | cut -d'"' -f2)"
    echo -e "${GREEN}内核版本:${NC} $(uname -r)"
    echo -e "${GREEN}运行时间:${NC} $(uptime -p | sed 's/up //')"
    echo -e "${GREEN}当前用户:${NC} $(whoami)"
    echo
}
# 显示CPU信息
show_cpu_info() {
    print_title "CPU 信息"
    # CPU型号
    echo -e "${GREEN}CPU型号:${NC} $(grep "model name" /proc/cpuinfo | head -1 | cut -d':' -f2 | sed 's/^ //')"
    # CPU核心数
    echo -e "${GREEN}CPU核心数:${NC} $(nproc)"
    # CPU使用率
    cpu_usage=$(top -bn1 | grep "Cpu(s)" | awk '{print $2}' | cut -d'%' -f1)
    echo -e "${GREEN}CPU使用率:${NC} ${cpu_usage}%"
    # 负载平均值
    loadavg=$(cat /proc/loadavg | awk '{print $1, $2, $3}')
    echo -e "${GREEN}负载平均值:${NC} $loadavg"
    echo
}
# 显示内存信息
show_memory_info() {
    print_title "内存信息"
    # 使用free命令获取内存信息
    mem_total=$(free -m | awk '/^Mem:/{print $2}')
    mem_used=$(free -m | awk '/^Mem:/{print $3}')
    mem_free=$(free -m | awk '/^Mem:/{print $4}')
    mem_available=$(free -m | awk '/^Mem:/{print $7}')
    mem_cache=$(free -m | awk '/^Mem:/{print $6}')
    echo -e "${GREEN}总内存:${NC} ${mem_total} MB"
    echo -e "${GREEN}已用内存:${NC} ${mem_used} MB"
    echo -e "${GREEN}空闲内存:${NC} ${mem_free} MB"
    echo -e "${GREEN}可用内存:${NC} ${mem_available} MB"
    echo -e "${GREEN}缓存:${NC} ${mem_cache} MB"
    # 内存使用率
    usage_percent=$((mem_used * 100 / mem_total))
    echo -e "${GREEN}内存使用率:${NC} ${usage_percent}%"
    # 显示内存进度条
    show_progress_bar $usage_percent
    echo
}
# 显示交换分区信息
show_swap_info() {
    print_title "交换分区"
    swap_total=$(free -m | awk '/^Swap:/{print $2}')
    swap_used=$(free -m | awk '/^Swap:/{print $3}')
    if [ $swap_total -eq 0 ]; then
        echo -e "${YELLOW}系统未配置交换分区${NC}"
    else
        echo -e "${GREEN}交换总大小:${NC} ${swap_total} MB"
        echo -e "${GREEN}已使用:${NC} ${swap_used} MB"
        swap_percent=$((swap_used * 100 / swap_total))
        echo -e "${GREEN}使用率:${NC} ${swap_percent}%"
    fi
    echo
}
# 显示磁盘信息
show_disk_info() {
    print_title "磁盘使用情况"
    # 显示主要分区信息
    df -h | grep -vE '^Filesystem|tmpfs|cdrom' | while read output;
    do
        filesystem=$(echo $output | awk '{print $1}')
        size=$(echo $output | awk '{print $2}')
        used=$(echo $output | awk '{print $3}')
        available=$(echo $output | awk '{print $4}')
        use_percent=$(echo $output | awk '{print $5}' | sed 's/%//')
        mounted=$(echo $output | awk '{print $6}')
        echo -e "${GREEN}文件系统:${NC} $filesystem"
        echo -e "${GREEN}大小:${NC} $size | ${GREEN}已用:${NC} $used | ${GREEN}可用:${NC} $available"
        echo -e "${GREEN}使用率:${NC} $use_percent%"
        echo -e "${GREEN}挂载点:${NC} $mounted"
        echo "---"
    done
}
# 显示网络信息
show_network_info() {
    print_title "网络信息"
    echo -e "${GREEN}主机名:${NC} $(hostname)"
    # 获取所有网络接口
    interfaces=$(ls /sys/class/net/ | grep -v lo)
    for interface in $interfaces; do
        ip_addr=$(ip addr show $interface 2>/dev/null | grep "inet " | awk '{print $2}' | cut -d'/' -f1)
        mac_addr=$(cat /sys/class/net/$interface/address)
        if [ -n "$ip_addr" ]; then
            echo -e "${GREEN}接口 $interface:${NC}"
            echo -e "  ${GREEN}IP地址:${NC} $ip_addr"
            echo -e "  ${GREEN}MAC地址:${NC} $mac_addr"
            echo
        fi
    done
    # 网络流量统计
    echo -e "${GREEN}网络流量统计:${NC}"
    rx_bytes=$(cat /sys/class/net/$interfaces/rx_bytes 2>/dev/null || echo 0)
    tx_bytes=$(cat /sys/class/net/$interfaces/tx_bytes 2>/dev/null || echo 0)
    echo -e "  接收: $(echo "scale=2; $rx_bytes/1024/1024" | bc) MB"
    echo -e "  发送: $(echo "scale=2; $tx_bytes/1024/1024" | bc) MB"
    echo
}
# 显示进程信息
show_process_info() {
    print_title "进程信息"
    echo -e "${GREEN}总进程数:${NC} $(ps aux | wc -l)"
    echo -e "${GREEN}运行中进程:${NC} $(ps aux | grep "R" | wc -l)"
    echo -e "\n${YELLOW}CPU使用率最高的5个进程:${NC}"
    ps aux --sort=-%cpu | head -6 | tail -5 | awk '{printf "%-8s %-8s %-6s %-6s %s\n", $1, $2, $3, $4, $11}'
    echo -e "\n${YELLOW}内存使用率最高的5个进程:${NC}"
    ps aux --sort=-%mem | head -6 | tail -5 | awk '{printf "%-8s %-8s %-6s %-6s %s\n", $1, $2, $3, $4, $11}'
    echo
}
# 显示登录用户
show_users() {
    print_title "当前登录用户"
    who | while read user terminal time rest
    do
        echo -e "${GREEN}用户:${NC} $user | ${GREEN}终端:${NC} $terminal | ${GREEN}登录时间:${NC} $time"
    done
    echo
}
# 显示进度条
show_progress_bar() {
    local percent=$1
    local width=50
    local filled=$((percent * width / 100))
    local empty=$((width - filled))
    echo -n "["
    for ((i=0; i<filled; i++)); do
        echo -n "#"
    done
    for ((i=0; i<empty; i++)); do
        echo -n "-"
    done
    echo "]"
}
# 显示温度信息(如果有传感器)
show_temperature() {
    print_title "系统温度"
    if [ -f /sys/class/thermal/thermal_zone0/temp ]; then
        temp=$(cat /sys/class/thermal/thermal_zone0/temp)
        temp_c=$(echo "scale=1; $temp/1000" | bc)
        color=$GREEN
        if (( $(echo "$temp_c > 60" | bc -l) )); then
            color=$RED
        elif (( $(echo "$temp_c > 45" | bc -l) )); then
            color=$YELLOW
        fi
        echo -e "${color}CPU温度: ${temp_c}°C${NC}"
        # 检查其他传感器
        for zone in /sys/class/thermal/thermal_zone*; do
            if [ -f "$zone/temp" ] && [ "$zone" != "/sys/class/thermal/thermal_zone0" ]; then
                temp=$(cat "$zone/temp")
                temp_c=$(echo "scale=1; $temp/1000" | bc)
                echo -e "${GREEN}传感器 ${zone##*_}: ${temp_c}°C${NC}"
            fi
        done
    else
        echo -e "${YELLOW}未找到温度传感器${NC}"
    fi
    echo
}
# 显示系统服务状态
show_services() {
    print_title "关键服务状态"
    services=("ssh" "nginx" "apache2" "mysql" "postgresql" "docker")
    for service in "${services[@]}"; do
        if systemctl is-active --quiet $service 2>/dev/null; then
            echo -e "${GREEN}● $service: 运行中${NC}"
        else
            echo -e "${RED}○ $service: 未运行${NC}"
        fi
    done
    echo
}
# 主菜单
show_main_menu() {
    clear
    echo -e "${PURPLE}╔════════════════════════════════════════╗${NC}"
    echo -e "${PURPLE}║       系统信息仪表盘 v1.0              ║${NC}"
    echo -e "${PURPLE}╚════════════════════════════════════════╝${NC}"
    echo
    echo -e "${YELLOW}请选择要查看的信息:${NC}"
    echo -e "${GREEN}1)${NC} 系统信息"
    echo -e "${GREEN}2)${NC} CPU信息"
    echo -e "${GREEN}3)${NC} 内存信息"
    echo -e "${GREEN}4)${NC} 磁盘信息"
    echo -e "${GREEN}5)${NC} 网络信息"
    echo -e "${GREEN}6)${NC} 进程信息"
    echo -e "${GREEN}7)${NC} 温度信息"
    echo -e "${GREEN}8)${NC} 服务状态"
    echo -e "${GREEN}9)${NC} 显示全部"
    echo -e "${GREEN}0)${NC} 退出"
    echo
}
# 主程序
main() {
    while true; do
        show_main_menu
        read -p "请输入选择 [0-9]: " choice
        case $choice in
            1) clear; show_system_info ;;
            2) clear; show_cpu_info ;;
            3) clear; show_memory_info; show_swap_info ;;
            4) clear; show_disk_info ;;
            5) clear; show_network_info ;;
            6) clear; show_process_info ;;
            7) clear; show_temperature ;;
            8) clear; show_services ;;
            9) 
                clear
                show_system_info
                show_cpu_info
                show_memory_info
                show_swap_info
                show_disk_info
                show_network_info
                show_process_info
                show_temperature
                show_services
                show_users
                ;;
            0) 
                echo -e "${GREEN}感谢使用系统信息仪表盘!${NC}"
                exit 0
                ;;
            *)
                echo -e "${RED}无效选择,请重试${NC}"
                sleep 1
                ;;
        esac
        echo
        read -p "按Enter键继续..." continue_input
    done
}
# 执行主程序
main "$@"

使用说明

  1. 保存脚本

    sudo tee /usr/local/bin/sysinfo.sh << 'EOF'
    [将上面的脚本内容粘贴到这里]
    EOF
  2. 赋予执行权限

    sudo chmod +x /usr/local/bin/sysinfo.sh
  3. 运行脚本

    ./sysinfo.sh

功能特点

  • 📊 实时监控:显示CPU、内存、磁盘等实时使用情况
  • 🎨 彩色显示:使用不同颜色区分不同类型的信息
  • 📋 分模块显示:按类别清晰展示系统信息
  • 🔄 交互式菜单:可选择查看特定信息
  • 📈 进度条:可视化显示内存使用率
  • 👥 用户信息:显示当前登录用户
  • 🌡️ 温度监控:显示CPU温度(硬件支持时)
  • ⚙️ 服务状态:检查关键服务运行状态

可选扩展功能

您可以根据需要添加以下功能:

# 添加系统更新检查
show_updates() {
    print_title "系统更新"
    updates_count=$(apt list --upgradable 2>/dev/null | grep -c upgradable)
    echo -e "${GREEN}可用更新:${NC} $updates_count 个"
}
# 添加快照功能
take_snapshot() {
    mkdir -p /tmp/sysinfo_snapshots
    timestamp=$(date +%Y%m%d_%H%M%S)
    snapshot_file="/tmp/sysinfo_snapshots/snapshot_$timestamp.txt"
    {
        show_system_info
        show_cpu_info
        show_memory_info
    } > $snapshot_file
    echo -e "${GREEN}快照已保存: $snapshot_file${NC}"
}

这个脚本提供了完整的系统监控功能,您可以根据实际需求进行调整和扩展。

抱歉,评论功能暂时关闭!