Files
conky_widget/metric.sh
T
Egutierrez e4fdd0199d feat: reloj permanente, pestañas Procesos y Devices, líneas pixel-perfect
- Gráficos de línea pixel-perfect: ANTIALIAS_NONE + ancho 1px + coords
  ancladas al centro del pixel, para trazos nítidos sobre la rejilla.
- Reloj + fecha (formato europeo) en una franja superior común a todas las
  pestañas; la barra de pestañas y el contenido bajan para hacerle sitio.
- Nueva pestaña Procesos: nº de procesos (total + en ejecución), hilos,
  carga 1/5/15 min y tablas TOP CPU / RAM / I/O. Cada fila muestra el PID
  (clicable, abre htop -p) separado del nombre.
- Nueva pestaña Devices: almacenamiento (lsblk sin loops), interfaces de
  red físicas e IP, y dispositivos USB (lsusb).
- Docker con detalle: contador running/total y, por contenedor, nombre +
  imagen + estado abreviado (Up 33h / Up 2d) coloreado según salud.
- Fix: el header de Docker se dibujaba con baseline directa y solapaba la
  barra de pestañas; ahora usa el mismo offset que el resto de paneles.
- metric.sh: helpers nproc_count/running, nthreads, load_avg, top_cpu/ram/io,
  disk_list, usb_list, net_ifaces, docker_list, docker_count.
- Ventana 545 -> 575 px de alto. app.md a v0.2.0.
2026-06-06 13:20:08 +02:00

54 lines
3.3 KiB
Bash
Executable File

#!/bin/sh
# Helper de metricas para conky_widget — imprime UN valor "pelado" (sin etiquetas).
# Portado del widget previo. Toda la logica con comillas/awk vive aqui para no
# romper el parser de conky ni el de widget.lua.
case "$1" in
gpu_util) nvidia-smi --query-gpu=utilization.gpu --format=csv,noheader,nounits ;;
gpu_temp) nvidia-smi --query-gpu=temperature.gpu --format=csv,noheader,nounits ;;
gpu_memp) nvidia-smi --query-gpu=memory.used,memory.total --format=csv,noheader,nounits \
| awk -F', ' '{printf "%d", $1/$2*100}' ;;
gpu_memi) nvidia-smi --query-gpu=memory.used,memory.total --format=csv,noheader,nounits \
| awk -F', ' '{printf "%d/%d MB", $1, $2}' ;;
cpu_temp) for h in /sys/class/hwmon/hwmon*; do
[ "$(cat "$h/name" 2>/dev/null)" = coretemp ] && { cat "$h/temp1_input"; break; }
done | awk '{printf "%d", $1/1000}' ;;
# --- Pestaña Procesos ---
nproc_count) ps -e --no-headers 2>/dev/null | wc -l ;;
nproc_running) awk '/^procs_running/{print $2}' /proc/stat 2>/dev/null ;;
nthreads) ps -eLf --no-headers 2>/dev/null | wc -l ;;
load_avg) awk '{printf "%s %s %s", $1, $2, $3}' /proc/loadavg 2>/dev/null ;;
# "pid %valor nombre" por linea, mayor primero
top_cpu) ps -eo pid=,pcpu=,comm= --sort=-pcpu 2>/dev/null | head -n 6 ;;
top_ram) ps -eo pid=,pmem=,comm= --sort=-pmem 2>/dev/null | head -n 6 ;;
# I/O por proceso: requiere pidstat (paquete sysstat); si falta, vacio.
# Las columnas kB_rd/s y kB_wr/s se cuentan desde el final (Command = ultimo
# campo, iodelay = NF-1, kB_ccwr/s = NF-2, kB_wr/s = NF-3, kB_rd/s = NF-4),
# robusto frente a que la primera columna sea epoch o UID.
top_io) command -v pidstat >/dev/null 2>&1 \
&& pidstat -d 1 1 2>/dev/null \
| awk 'NF>=6 && $NF!="Command" && $0 !~ /Average|Linux|^[[:space:]]*$/ \
{ io=$(NF-4)+$(NF-3); if (io>0) printf "%s %.0f %s\n", $(NF-5), io, $NF }' \
| sort -k2 -rn | head -n 5 \
|| echo "" ;;
# --- Pestaña Devices ---
# -e 7,11 excluye loops (snaps) y cdrom; solo discos reales
disk_list) lsblk -dno NAME,SIZE,MODEL -e 7,11 2>/dev/null | head -n 8 ;;
usb_list) lsusb 2>/dev/null \
| sed -E 's/^Bus [0-9]+ Device [0-9]+: ID [0-9a-fA-F]+:[0-9a-fA-F]+ //' \
| grep -viE 'root hub' | head -n 10 ;;
# Interfaces fisicas/reales (excluye docker, bridges, veth, virbr)
net_ifaces) ip -br -4 addr 2>/dev/null \
| awk '$1 !~ /^(docker|br-|veth|virbr)/ && ($2=="UP" || $1=="lo") {printf "%s %s\n", $1, $3}' \
| head -n 6 ;;
# --- Pestaña Docker ---
# "nombre|estado|imagen" por contenedor. Estado y imagen abreviados.
docker_list) docker ps --format '{{.Names}}|{{.Status}}|{{.Image}}' 2>/dev/null \
| sed -E 's/Up ([0-9]+) seconds?/Up \1s/; s/Up ([0-9]+) minutes?/Up \1m/; s/Up ([0-9]+) hours?/Up \1h/; s/Up ([0-9]+) days?/Up \1d/; s/Up ([0-9]+) weeks?/Up \1w/; s/Up ([0-9]+) months?/Up \1mo/; s/Up Less than a second/Up 0s/; s/ \(healthy\)//; s/ \(unhealthy\)/ BAD/' \
| head -n 14 ;;
docker_count) printf "%s/%s" "$(docker ps -q 2>/dev/null | wc -l)" "$(docker ps -aq 2>/dev/null | wc -l)" ;;
*) echo 0 ;;
esac