Update hwmon.sh
This commit is contained in:
@@ -1,6 +1,6 @@
|
|||||||
#!/usr/bin/env bash
|
#!/usr/bin/env bash
|
||||||
#
|
#
|
||||||
# power.sh - Universal CPU Power & Multi-Core Temperature Monitor
|
# power.sh - Universal CPU Power, Multi-Core & NIC Temperature Monitor
|
||||||
|
|
||||||
INTERVAL=1.0 # Refresh rate in seconds
|
INTERVAL=1.0 # Refresh rate in seconds
|
||||||
|
|
||||||
@@ -13,7 +13,7 @@ cleanup() {
|
|||||||
trap cleanup SIGINT SIGTERM
|
trap cleanup SIGINT SIGTERM
|
||||||
|
|
||||||
if [[ $EUID -ne 0 ]]; then
|
if [[ $EUID -ne 0 ]]; then
|
||||||
echo "Error: This script must be run as root to access CPU RAPL counters."
|
echo "Error: This script must be run as root to access CPU RAPL counters and ethtool."
|
||||||
exit 1
|
exit 1
|
||||||
fi
|
fi
|
||||||
|
|
||||||
@@ -22,6 +22,11 @@ if ! command -v perf &>/dev/null; then
|
|||||||
exit 1
|
exit 1
|
||||||
fi
|
fi
|
||||||
|
|
||||||
|
if ! command -v ethtool &>/dev/null; then
|
||||||
|
echo "Error: 'ethtool' command not found. Install with: apt install ethtool"
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
|
||||||
VENDOR_ID=$(grep -m 1 'vendor_id' /proc/cpuinfo | awk '{print $3}')
|
VENDOR_ID=$(grep -m 1 'vendor_id' /proc/cpuinfo | awk '{print $3}')
|
||||||
|
|
||||||
# --- Detect RAPL Power Events ---
|
# --- Detect RAPL Power Events ---
|
||||||
@@ -48,7 +53,6 @@ if [[ ${#EVENTS[@]} -eq 0 ]]; then
|
|||||||
fi
|
fi
|
||||||
|
|
||||||
# --- Map Thermal Sensors ---
|
# --- Map Thermal Sensors ---
|
||||||
# Arrays to hold ordered (label, file_path) pairs
|
|
||||||
CORE_LABELS=()
|
CORE_LABELS=()
|
||||||
CORE_PATHS=()
|
CORE_PATHS=()
|
||||||
PKG_LABEL=""
|
PKG_LABEL=""
|
||||||
@@ -60,7 +64,6 @@ for hwmon in /sys/class/hwmon/hwmon*; do
|
|||||||
|
|
||||||
# Intel Sensors (coretemp)
|
# Intel Sensors (coretemp)
|
||||||
if [[ "$DRIVER_NAME" == "coretemp" ]]; then
|
if [[ "$DRIVER_NAME" == "coretemp" ]]; then
|
||||||
# Sort label files numerically (temp1_label, temp2_label...)
|
|
||||||
for label_file in $(ls -v "$hwmon"/temp*_label 2>/dev/null); do
|
for label_file in $(ls -v "$hwmon"/temp*_label 2>/dev/null); do
|
||||||
if [[ -f "$label_file" ]]; then
|
if [[ -f "$label_file" ]]; then
|
||||||
LABEL=$(cat "$label_file" 2>/dev/null)
|
LABEL=$(cat "$label_file" 2>/dev/null)
|
||||||
@@ -112,11 +115,6 @@ read_temp() {
|
|||||||
# Colorize temperature values
|
# Colorize temperature values
|
||||||
format_temp() {
|
format_temp() {
|
||||||
local temp="$1"
|
local temp="$1"
|
||||||
if [[ "$temp" == "N/A" ]]; then
|
|
||||||
echo -e "\e[1;30mN/A\e[0m"
|
|
||||||
return
|
|
||||||
fi
|
|
||||||
|
|
||||||
if awk "BEGIN {exit !($temp >= 80)}"; then
|
if awk "BEGIN {exit !($temp >= 80)}"; then
|
||||||
printf "\e[1;31m%5.1f°C\e[0m" "$temp" # Red (>= 80C)
|
printf "\e[1;31m%5.1f°C\e[0m" "$temp" # Red (>= 80C)
|
||||||
elif awk "BEGIN {exit !($temp >= 65 && $temp < 80)}"; then
|
elif awk "BEGIN {exit !($temp >= 65 && $temp < 80)}"; then
|
||||||
@@ -148,7 +146,7 @@ while true; do
|
|||||||
|
|
||||||
# --- UI Rendering ---
|
# --- UI Rendering ---
|
||||||
echo "=================================================="
|
echo "=================================================="
|
||||||
echo " CPU Power & Temperature Monitor "
|
echo " CPU Power & Hardware Temp Monitor "
|
||||||
echo "=================================================="
|
echo "=================================================="
|
||||||
echo " Hostname : $(hostname)"
|
echo " Hostname : $(hostname)"
|
||||||
echo " CPU Vendor : $VENDOR_ID"
|
echo " CPU Vendor : $VENDOR_ID"
|
||||||
@@ -190,6 +188,41 @@ while true; do
|
|||||||
if [[ -n "$DRAM_WATTS" ]]; then
|
if [[ -n "$DRAM_WATTS" ]]; then
|
||||||
printf " DRAM Memory Power : \e[1;35m%7.2f Watts\e[0m\n" "$DRAM_WATTS"
|
printf " DRAM Memory Power : \e[1;35m%7.2f Watts\e[0m\n" "$DRAM_WATTS"
|
||||||
fi
|
fi
|
||||||
|
|
||||||
|
# --- Network Interface Temperatures ---
|
||||||
|
echo "--------------------------------------------------"
|
||||||
|
echo " Physical NIC Optics Temperatures:"
|
||||||
|
found_iface=0
|
||||||
|
|
||||||
|
# Iterate through all network interfaces
|
||||||
|
for iface_path in /sys/class/net/*; do
|
||||||
|
iface="${iface_path##*/}"
|
||||||
|
[[ "$iface" == "lo" ]] && continue
|
||||||
|
|
||||||
|
# Skip virtual interfaces
|
||||||
|
if [[ -L "$iface_path" && $(readlink -f "$iface_path") == *"/virtual/"* ]]; then
|
||||||
|
continue
|
||||||
|
fi
|
||||||
|
|
||||||
|
# Grab strictly the current temperature line, avoiding the high/low thresholds
|
||||||
|
temp_line=$(ethtool -m "$iface" 2>/dev/null | grep -E "^[[:space:]]*Module temperature[[:space:]]*:" -m 1)
|
||||||
|
|
||||||
|
if [[ -n "$temp_line" ]]; then
|
||||||
|
# Extract just the numeric value
|
||||||
|
iface_temp=$(echo "$temp_line" | awk -F':' '{print $2}' | awk '{print $1}')
|
||||||
|
|
||||||
|
# Verify the result is actually a number before trying to format it
|
||||||
|
if [[ "$iface_temp" =~ ^[0-9]+(\.[0-9]+)?$ || "$iface_temp" =~ ^-[0-9]+(\.[0-9]+)?$ ]]; then
|
||||||
|
found_iface=1
|
||||||
|
printf " %-15s: %b\n" "$iface" "$(format_temp "$iface_temp")"
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
done
|
||||||
|
|
||||||
|
if [[ $found_iface -eq 0 ]]; then
|
||||||
|
echo " No readable optic temperatures found."
|
||||||
|
fi
|
||||||
|
|
||||||
echo "=================================================="
|
echo "=================================================="
|
||||||
echo "Press [CTRL+C] to exit."
|
echo "Press [CTRL+C] to exit."
|
||||||
done
|
done
|
||||||
Reference in New Issue
Block a user