本文目录导读:

我来帮您编写一个系统信息仪表盘脚本,这是一个功能完整的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 "$@"
使用说明
-
保存脚本:
sudo tee /usr/local/bin/sysinfo.sh << 'EOF' [将上面的脚本内容粘贴到这里] EOF
-
赋予执行权限:
sudo chmod +x /usr/local/bin/sysinfo.sh
-
运行脚本:
./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}"
}
这个脚本提供了完整的系统监控功能,您可以根据实际需求进行调整和扩展。