feat: multi-percentage monitors (per-core CPU), max 8

This commit is contained in:
Pi Agent
2026-09-02 16:13:36 +00:00
parent 4f98490224
commit 887d45a771
9 changed files with 112 additions and 41 deletions
+21 -3
View File
@@ -1,8 +1,26 @@
#!/bin/sh
# CPU: процент загрузки + число ядер. Linux + mac.
# Контракт мониторов: 1-я строка — процент, дальше — key=value.
# CPU: общий процент + по ядру на каждое ядро (Linux). Mac: только общий.
# Контракт мониторов: первые N строк (monitor.percentages, max 8) — проценты,
# дальше — key=value.
case "$(uname)" in
Darwin) cores=$(sysctl -n hw.ncpu) ;;
*) cores=$(nproc) ;;
esac
ps -A -o %cpu | awk -v c="$cores" '{s+=$1} END {printf "%d\nядер=%d\n", s/c, c}'
overall=$(ps -A -o %cpu | awk -v c="$cores" '{s+=$1} END {printf "%d", s/c}')
echo "$overall"
# per-core: два среза /proc/stat (user..steal), usage = 1 - Δidle/Δtotal
if [ -r /proc/stat ]; then
a=$(grep '^cpu[0-9]* ' /proc/stat | awk '{i=$5+$6; t=0; for(n=2;n<=8;n++) t+=$n; print i, t}')
sleep 0.5
# оба среза одним awk: первая половина строк — срез 1, вторая — срез 2
printf '%s\n%s\n' "$a" "$(grep '^cpu[0-9]* ' /proc/stat | awk '{i=$5+$6; t=0; for(n=2;n<=8;n++) t+=$n; print i, t}')" | awk '
{ ia[NR]=$1; ta[NR]=$2; n=NR }
END {
half=n/2
for (r=1; r<=half; r++) {
di=ia[r+half]-ia[r]; dt=ta[r+half]-ta[r]
printf "%d\n", (dt>0 ? (1-di/dt)*100 : 0)
}
}'
fi
echo "ядер=$cores"