System stats on terminal (debian / ubuntu)
1/20/2026
This document explains how to install prerequisites, create the script, fix permissions, and run it safely on a Proxmox host, including with:
watch -n 1 stats.sh
1️⃣ Prerequisites
Proxmox is Debian-based. Ensure the required tools are installed.
Update system
apt update
Install required packages
sudo apt install -y procps lm-sensors coreutils iproute2
2️⃣ Create script directory
mkdir -p /usr/local/bin/battery
3️⃣ Create the script file
nano /usr/local/bin/battery/stats.sh
4️⃣ Paste the FULL script
#!/bin/bash
set -u
############################
# BATTERY STATUS
############################
echo "🔋 Battery status"
echo "------------------"
BAT_TOTAL_ENERGY=0
BAT_TOTAL_RATE=0
BAT_TIME_LEFT="N/A"
BAT_ON_BATTERY=0
for bat in /sys/class/power_supply/BAT*; do
if [ -f "$bat/capacity" ]; then
BAT_NAME=$(basename "$bat")
BAT_CAPACITY=$(cat "$bat/capacity")
BAT_STATUS=$(cat "$bat/status")
BAT_ENERGY_NOW=$(cat "$bat/energy_now" 2>/dev/null || echo 0)
BAT_POWER_NOW=$(cat "$bat/power_now" 2>/dev/null || echo 0)
BAT_TOTAL_ENERGY=$((BAT_TOTAL_ENERGY + BAT_ENERGY_NOW))
BAT_TOTAL_RATE=$((BAT_TOTAL_RATE + BAT_POWER_NOW))
echo "$BAT_NAME → $BAT_CAPACITY% ($BAT_STATUS)"
if [ "$BAT_STATUS" = "Discharging" ]; then
BAT_ON_BATTERY=1
fi
fi
done
BAT_POWER_W=$(awk "BEGIN {printf \"%.2f\", $BAT_TOTAL_RATE/1000000}")
if [ "$BAT_ON_BATTERY" -eq 1 ] && [ "$BAT_TOTAL_RATE" -gt 0 ]; then
BAT_HOURS=$(awk "BEGIN {printf \"%.4f\", $BAT_TOTAL_ENERGY/$BAT_TOTAL_RATE}")
BAT_TIME_LEFT=$(awk "BEGIN {
h=int($BAT_HOURS);
m=int(($BAT_HOURS-h)*60);
printf \"%02d:%02d\", h, m
}")
fi
echo
echo "⚡ Power draw: ${BAT_POWER_W} W"
if [ "$BAT_ON_BATTERY" -eq 1 ]; then
echo "⏱ Estimated time left: ${BAT_TIME_LEFT}"
else
echo "🔌 On AC power"
fi
############################
# SYSTEM STATUS
############################
echo
echo "🖥 System status"
echo "------------------"
# CPU usage
CPU_IDLE_PCT=$(top -bn1 | awk -F',' '/Cpu\(s\)/ {print $4}' | awk '{print $1}')
CPU_USAGE_PCT=$(awk "BEGIN {printf \"%.1f\", 100 - $CPU_IDLE_PCT}")
echo "🔥 CPU usage: ${CPU_USAGE_PCT}%"
# CPU temperature
CPU_TEMP=$(sensors 2>/dev/null | awk '/Package id 0:/ {print $4}' | head -n1)
[ -z "$CPU_TEMP" ] && CPU_TEMP="N/A"
echo "🌡 CPU temp: $CPU_TEMP"
# RAM usage (watch-safe)
RAM_TOTAL_MB=$(awk '/MemTotal/ {printf "%.0f", $2/1024}' /proc/meminfo)
RAM_AVAIL_MB=$(awk '/MemAvailable/ {printf "%.0f", $2/1024}' /proc/meminfo)
RAM_USED_MB=$((RAM_TOTAL_MB - RAM_AVAIL_MB))
RAM_USED_PCT=$(awk "BEGIN {printf \"%.2f\", ($RAM_USED_MB/$RAM_TOTAL_MB)*100}")
echo "🧠 RAM: ${RAM_USED_MB}MB / ${RAM_TOTAL_MB}MB (${RAM_USED_PCT}%)"
# Disk usage (root filesystem)
DISK_ROOT_USAGE=$(df -h / | awk 'NR==2 {print $3 " / " $2 " (" $5 ")"}')
echo "💾 Disk: $DISK_ROOT_USAGE"
# Network speed (1-second sample)
NET_IFACE=$(ip route | awk '/default/ {print $5; exit}')
NET_RX_1=$(cat /sys/class/net/$NET_IFACE/statistics/rx_bytes)
NET_TX_1=$(cat /sys/class/net/$NET_IFACE/statistics/tx_bytes)
sleep 1
NET_RX_2=$(cat /sys/class/net/$NET_IFACE/statistics/rx_bytes)
NET_TX_2=$(cat /sys/class/net/$NET_IFACE/statistics/tx_bytes)
NET_RX_KB_S=$(awk "BEGIN {printf \"%.1f\", ($NET_RX_2-$NET_RX_1)/1024}")
NET_TX_KB_S=$(awk "BEGIN {printf \"%.1f\", ($NET_TX_2-$NET_TX_1)/1024}")
echo "🌐 Network ($NET_IFACE): ↓ ${NET_RX_KB_S} KB/s ↑ ${NET_TX_KB_S} KB/s"
Save and exit nano
Ctrl + O → Enter
Ctrl + X
5️⃣ Make the script executable
chmod +x /usr/local/bin/battery/stats.sh
6️⃣ Run the script
/usr/local/bin/battery/stats.sh
7️⃣ Run from anywhere (optional)
If /usr/local/bin is in PATH (default on Proxmox):
stats.sh
To remove .sh extension:
mv /usr/local/bin/battery/stats.sh /usr/local/bin/stats
chmod +x /usr/local/bin/stats
Run:
stats
8️⃣ Use with watch (real-time monitoring)
watch -n 1 stats
9️⃣ Example output
🔋 Battery status
BAT0 → 86% (Discharging)
⚡ Power draw: 12.10 W
⏱ Estimated time left: 03:28
🖥 System status
🔥 CPU usage: 5.3%
🌡 CPU temp: +48.0°C
🧠 RAM: 6123MB / 7684MB (79.74%)
💾 Disk: 18G / 94G (21%)
🌐 Network (eno1): ↓ 41.8 KB/s ↑ 3.2 KB/s