#!/bin/bash GREEN='\033[32m' YELLOW='\033[33m' RED='\033[31m' RESET='\033[0m' OVERALL=0 set_warning() { [ "$OVERALL" -lt 1 ] && OVERALL=1 } set_danger() { OVERALL=2 } echo echo "Pi Health" echo "────────────────────────────" # CPU CPU=$(top -bn1 | awk '/Cpu\(s\)/ {printf "%.1f", 100 - $8}') printf "CPU: " if awk "BEGIN {exit !($CPU >= 90)}"; then printf "${RED}%s%%${RESET}\n" "$CPU" set_danger elif awk "BEGIN {exit !($CPU >= 70)}"; then printf "${YELLOW}%s%%${RESET}\n" "$CPU" set_warning else printf "${GREEN}%s%%${RESET}\n" "$CPU" fi # RAM read -r TOTAL USED <<< "$(free -m | awk '/^Mem:/ {print $2, $2-$4-$6}')" RAM_PCT=$(awk "BEGIN {printf \"%.1f\", ($USED/$TOTAL)*100}") printf "RAM: " if awk "BEGIN {exit !($RAM_PCT >= 85)}"; then printf "${RED}%s%%${RESET}" "$RAM_PCT" set_danger elif awk "BEGIN {exit !($RAM_PCT >= 70)}"; then printf "${YELLOW}%s%%${RESET}" "$RAM_PCT" set_warning else printf "${GREEN}%s%%${RESET}" "$RAM_PCT" fi printf " (%s / %s MB)\n" "$USED" "$TOTAL" # Swap read -r SWAP_TOTAL SWAP_USED <<< "$(free -m | awk '/^Swap:/ {print $2, $3}')" if [ "$SWAP_TOTAL" -gt 0 ]; then SWAP_PCT=$(awk "BEGIN {printf \"%.1f\", ($SWAP_USED/$SWAP_TOTAL)*100}") else SWAP_PCT=0 fi printf "Swap: " if awk "BEGIN {exit !($SWAP_PCT >= 30)}"; then printf "${RED}%s%%${RESET}" "$SWAP_PCT" set_danger elif awk "BEGIN {exit !($SWAP_PCT >= 10)}"; then printf "${YELLOW}%s%%${RESET}" "$SWAP_PCT" set_warning else printf "${GREEN}%s%%${RESET}" "$SWAP_PCT" fi printf " (%s / %s MB)\n" "$SWAP_USED" "$SWAP_TOTAL" # Load average read -r LOAD1 LOAD5 LOAD15 <<< "$(awk '{print $1, $2, $3}' /proc/loadavg)" CORES=$(nproc) LOAD_PER_CORE=$(awk "BEGIN {printf \"%.2f\", $LOAD1/$CORES}") printf "Load: " if awk "BEGIN {exit !($LOAD_PER_CORE >= 1)}"; then printf "${RED}HIGH${RESET}" set_danger elif awk "BEGIN {exit !($LOAD_PER_CORE >= 0.625)}"; then printf "${YELLOW}ELEVATED${RESET}" set_warning else printf "${GREEN}NORMAL${RESET}" fi printf " (%s / %s / %s)\n" "$LOAD1" "$LOAD5" "$LOAD15" # Temperature TEMP=$(vcgencmd measure_temp | sed "s/temp=//;s/'C//") printf "Temp: " if awk "BEGIN {exit !($TEMP >= 75)}"; then printf "${RED}%s°C${RESET}\n" "$TEMP" set_danger elif awk "BEGIN {exit !($TEMP >= 65)}"; then printf "${YELLOW}%s°C${RESET}\n" "$TEMP" set_warning else printf "${GREEN}%s°C${RESET}\n" "$TEMP" fi # Disk DISK=$(df / | awk 'NR==2 {gsub("%",""); print $5}') printf "Disk: " if [ "$DISK" -ge 85 ]; then printf "${RED}%s%%${RESET}\n" "$DISK" set_danger elif [ "$DISK" -ge 70 ]; then printf "${YELLOW}%s%%${RESET}\n" "$DISK" set_warning else printf "${GREEN}%s%%${RESET}\n" "$DISK" fi # Wi-Fi WIFI=$(iw dev wlan0 link | awk '/signal:/ {print $2}') printf "Wi-Fi: " if [ -z "$WIFI" ]; then printf "${RED}DISCONNECTED${RESET}\n" set_danger elif [ "$WIFI" -ge -60 ]; then printf "${GREEN}EXCELLENT${RESET}\n" elif [ "$WIFI" -ge -67 ]; then printf "${GREEN}GOOD${RESET}\n" elif [ "$WIFI" -ge -75 ]; then printf "${YELLOW}FAIR${RESET}\n" set_warning elif [ "$WIFI" -ge -80 ]; then printf "${YELLOW}WEAK${RESET}\n" set_warning else printf "${RED}POOR${RESET}\n" set_danger fi # Throttling / power state THROTTLED=$(vcgencmd get_throttled | cut -d= -f2) THROTTLED_DEC=$((THROTTLED)) CURRENT_UNDERVOLTAGE=$((THROTTLED_DEC & 0x1)) CURRENT_FREQ_CAP=$((THROTTLED_DEC & 0x2)) CURRENT_THROTTLED=$((THROTTLED_DEC & 0x4)) CURRENT_SOFT_TEMP=$((THROTTLED_DEC & 0x8)) HIST_UNDERVOLTAGE=$((THROTTLED_DEC & 0x10000)) HIST_FREQ_CAP=$((THROTTLED_DEC & 0x20000)) HIST_THROTTLED=$((THROTTLED_DEC & 0x40000)) HIST_SOFT_TEMP=$((THROTTLED_DEC & 0x80000)) # Power printf "Power: " if [ "$CURRENT_UNDERVOLTAGE" -ne 0 ]; then printf "${RED}DANGER — Under-voltage NOW${RESET}\n" set_danger elif [ "$HIST_UNDERVOLTAGE" -ne 0 ]; then printf "${YELLOW}WARNING — Under-voltage occurred${RESET}\n" set_warning else printf "${GREEN}OK — No issues detected${RESET}\n" fi # Thermal / throttling printf "Thermal: " if [ "$CURRENT_THROTTLED" -ne 0 ] || [ "$CURRENT_SOFT_TEMP" -ne 0 ] || [ "$CURRENT_FREQ_CAP" -ne 0 ]; then printf "${RED}DANGER — Throttling NOW${RESET}\n" set_danger elif [ "$HIST_THROTTLED" -ne 0 ] || [ "$HIST_SOFT_TEMP" -ne 0 ] || [ "$HIST_FREQ_CAP" -ne 0 ]; then printf "${YELLOW}WARNING — Throttling occurred${RESET}\n" set_warning else printf "${GREEN}OK — No throttling${RESET}\n" fi # Uptime — always green UPTIME=$(uptime -p | sed \ -e 's/up //' \ -e 's/ days\?/d/' \ -e 's/ hours\?/h/' \ -e 's/ minutes\?/m/' \ -e 's/,//g') printf "Uptime: ${GREEN}%s${RESET}\n" "$UPTIME" echo "────────────────────────────" printf "Overall: " if [ "$OVERALL" -eq 2 ]; then printf "${RED}DANGER${RESET}\n" elif [ "$OVERALL" -eq 1 ]; then printf "${YELLOW}WARNING${RESET}\n" else printf "${GREEN}HEALTHY${RESET}\n" fi echo