#!/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