56 lines
2.4 KiB
Bash
Executable file
56 lines
2.4 KiB
Bash
Executable file
#!/usr/bin/env bash
|
|
|
|
# This doesn't show overall/summarized CPU usage as e.g. macOS Activity Monitor
|
|
# But still capable of showing high/multicore process CPU usage
|
|
cpu_usage=$(ps -Ac -o %cpu,comm | sort -nk1 | grep -vE "(top)" | tail -1)
|
|
float=$(echo "$cpu_usage" | awk '{print $1}')
|
|
cpu_percent=${float%.*}
|
|
cpu_procname=$(echo "$cpu_usage" | awk '{print $2,$3,$4}')
|
|
|
|
# nettop needs at least two samples (-L 2) to calculate a delta
|
|
# the beasty awk then throws away the first 50% samples (n=50) with bogus
|
|
# data and sorts it by bytes_in
|
|
bandwidth=$(nettop -t wifi -P -J bytes_in,bytes_out -d -x -L 2 \
|
|
| grep -v '^time' | sort -k1 | awk -v n=50 '{a[FNR]=$0; \
|
|
min=FNR-int(FNR*n/100)} {i=min; while(i in a) delete a[i--]} \
|
|
END{for(i=min+1;i<=FNR;++i) print a[i]}' - | sed 's/,$//' \
|
|
| sed 's#\.[0-9]*##g' | sort -t',' -k 3 -n | tail -1 | \
|
|
awk -F',' '{print $3,$4,$2}')
|
|
|
|
value=$(echo "$bandwidth" | awk '{print $1}')
|
|
if [ "$value" -lt 1000 ]; then
|
|
bw_down=$(echo "$value" | awk '{print int($1),"B/s"}')
|
|
elif [ "$value" -ge 1000 ] && [ "$value" -lt 1000000 ]; then
|
|
bw_down=$(echo "$value" | awk '{print int($1/1000),"kB/s"}')
|
|
elif [ "$value" -ge 1000000 ]; then
|
|
bw_down=$(echo "$value" | awk '{print int($1/1000^2),"MB/s"}')
|
|
fi
|
|
value=$(echo "$bandwidth" | awk '{print $2}')
|
|
if [ "$value" -lt 1000 ]; then
|
|
bw_up=$(echo "$value" | awk '{print int($2),"B/s"}')
|
|
elif [ "$value" -ge 1000 ] && [ "$value" -lt 1000000 ]; then
|
|
bw_up=$(echo "$value" | awk '{print int($2/1000),"kB/s"}')
|
|
elif [ "$value" -ge 1000000 ]; then
|
|
bw_up=$(echo "$value" | awk '{print int($2/1000^2),"MB/s"}')
|
|
fi
|
|
bw_procname=$(echo "$bandwidth" | awk '{print $3,$4,$5}')
|
|
|
|
# Pings the default gateway and returns avg ping. Three ping counts
|
|
# recommended for a reasonably meaningful average
|
|
ping=$(ping -t 2 -q -c 3 "$(route -n get default | \
|
|
awk '$1 ~ "gateway:" {print $2}')" | \
|
|
awk -F'/' '$1 ~ "round-trip" {print int($5)}')
|
|
|
|
# cpu load 4 digits max, smaller value is padded
|
|
# cpu process name right padded
|
|
cpu=$(printf "%4d%% %#-14.14s" "$cpu_percent" "$cpu_procname")
|
|
|
|
# up/download 8 digits max each, pad smaller value (has units baked in)
|
|
# process name right padded
|
|
bandwidth=$(printf "↓%8s ↑%8s %#-14.14s" "$bw_down" "$bw_up" "$bw_procname")
|
|
|
|
# cpu load 4 digits max, smaller value is padded
|
|
ping=$(printf "%4dms " "$ping")
|
|
|
|
# Combine all printf formatted metrics
|
|
echo "$ping $bandwidth $cpu"
|