#!/usr/bin/env bash set -Eeuo pipefail # --- 配置区 --- CHAT_ID="-1003834524994" TOPIC_ID="4" BOT_TOKEN="${OPENCLAW_TELEGRAM_BOT_TOKEN:-}" TOP_N=5 # -------------- have() { command -v "$1" >/dev/null 2>&1; } draw_bar() { local percent=$1 local width=10 local filled=$(( percent * width / 100 )) [[ $filled -gt $width ]] && filled=$width local empty=$(( width - filled )) local bar="" for ((i=0; i0?$3*100/$2:0)}' } get_root_disk() { df -h / | awk 'NR==2 {print $3, $2, $5}' | tr -d '%' } get_inode() { df -i / | awk 'NR==2 {printf "%s / %s (%s)", $3, $2, $5}' } get_top_partitions() { # 排除虚拟文件系统与无关 EFI 分区,按占用率排序取前3 df -h | grep -vE '^tmpfs|cdrom|loop|udev' | awk 'NR>1 && $6 != "/boot/efi" && $6 != "/sys/firmware/efi/efivars" {print $5, $6, $3, $2}' | sort -rn | head -n 3 | \ awk '{printf "%-4s %-12s (%s/%s)\n", $1, $2, $3, $4}' } get_top_procs() { local sort_type=$1 # %cpu 或 %mem # PID, USER, CPU, MEM, TIME, COMMAND ps -eo pid,user,%cpu,%mem,etime,comm --sort=-"$sort_type" | head -n $((TOP_N+1)) | tail -n +2 | \ awk '{printf "%-6s %-4s %-4s %s\n", $1, $3"%", $4"%", $6}' } # --- 报告生成 --- build_report() { local cpu_p m_usd m_tot m_p s_usd s_tot s_p d_usd d_tot d_p host up load temp icon ip # 采集 cpu_p=$(get_cpu_p) read -r m_usd m_tot m_p s_usd s_tot s_p < <(get_mem_data) read -r d_usd d_tot d_p < <(get_root_disk) host=$(hostname) ip=$(hostname -I | awk '{print $1}') up=$(uptime -p | sed 's/^up //') load=$(awk '{print $1" / "$2" / "$3}' /proc/loadavg) temp=$( (sensors 2>/dev/null | awk '/°C/ {print $2; exit}' | tr -d '+') || (awk '{printf "%.1f°C", $1/1000}' /sys/class/thermal/thermal_zone0/temp 2>/dev/null) || echo "N/A" ) # 状态判断 if [ "$cpu_p" -gt 85 ] || [ "$m_p" -gt 90 ]; then icon="🔴 Critical"; status="⚠️ 资源占用过高"; else icon="🟢 Healthy"; status="✅ 未见明显异常"; fi cat <🖥 Server: ${host} (${ip}) 状态: ${icon} ${status} ━━━━━━━━━━━━━━━━━━ 核心指标: CPU $(draw_bar $cpu_p) $(printf "%3d" $cpu_p)% RAM $(draw_bar $m_p) $(printf "%3d" $m_p)% DSK $(draw_bar $d_p) $(printf "%3d" $d_p)% 📊 详细概览:运行时间: $up平均负载: $load内存详情: ${m_usd}MB / ${m_tot}MB交换分区: ${s_usd}MB / ${s_tot}MB (${s_p}%)根分区: ${d_usd} / ${d_tot}Inode: $(get_inode)系统温度: $temp 🗄 繁忙分区 Top 5:
$(get_top_partitions)
🔥 CPU Top 5 (PID/CPU/MEM/CMD):
$(get_top_procs %cpu)
🧠 MEM Top 5 (PID/CPU/MEM/CMD):
$(get_top_procs %mem)
🕒 $(date '+%Y-%m-%d %H:%M:%S') EOF } send_telegram() { local text="$1" [[ -z "$BOT_TOKEN" ]] && return 1 curl -s -X POST "https://api.telegram.org/bot${BOT_TOKEN}/sendMessage" \ -d "chat_id=${CHAT_ID}" \ -d "message_thread_id=${TOPIC_ID}" \ -d "parse_mode=HTML" \ --data-urlencode "text=${text}" > /dev/null } send_telegram "$(build_report)"