#!/usr/bin/env bash # Una fila de medida del nodo de la rp1 cada vez que se llama (cron cada 5 min). # CSV: fecha, best, finalizado, pares, rss_mb, cpu_pct, datos_mb, load1, temp_c, ci_activo set -uo pipefail BASE="$HOME/origin-chain" CSV="$BASE/logs/medidas.csv" [ -f "$CSV" ] || echo "fecha,best,finalizado,pares,rss_mb,cpu_pct,datos_mb,load1,temp_c,ci_activo" >"$CSV" rpc() { curl -s -m 5 -H 'Content-Type: application/json' \ -d "{\"id\":1,\"jsonrpc\":\"2.0\",\"method\":\"$1\",\"params\":[${2:-}]}" http://127.0.0.1:9944 } num() { python3 -c "import json,sys; r=json.load(sys.stdin)['result']; print(int(r['number'],16) if isinstance(r,dict) else r)" 2>/dev/null || echo NA; } best=$(rpc chain_getHeader | num) fh=$(rpc chain_getFinalizedHead | python3 -c "import json,sys;print(json.load(sys.stdin)['result'])" 2>/dev/null || echo "") fin=NA; [ -n "$fh" ] && fin=$(rpc chain_getHeader "\"$fh\"" | num) pares=$(rpc system_health | python3 -c "import json,sys;print(json.load(sys.stdin)['result']['peers'])" 2>/dev/null || echo NA) pid=$(cat "$BASE/nodo.pid" 2>/dev/null || echo 0) rss=NA; cpu=NA if kill -0 "$pid" 2>/dev/null; then read -r rss cpu < <(ps -o rss=,pcpu= -p "$pid" | awk '{printf "%.0f %s\n", $1/1024, $2}') fi datos=$(du -sm "$BASE/data" 2>/dev/null | cut -f1) load1=$(cut -d' ' -f1 /proc/loadavg) temp=$(awk '{printf "%.1f", $1/1000}' /sys/class/thermal/thermal_zone0/temp) ci=$(systemctl is-active gitea-runner 2>/dev/null || echo NA) echo "$(date -Is),$best,$fin,$pares,$rss,$cpu,$datos,$load1,$temp,$ci" >>"$CSV" # Rotación del log del nodo: al pasar de 32 MB se guarda comprimido y se trunca. El nodo # escribe en modo append, así que sigue al final del fichero truncado, sin huecos. ACTUAL=$(readlink -f "$BASE/logs/actual.log" 2>/dev/null || true) if [ -n "$ACTUAL" ] && [ -f "$ACTUAL" ] && [ "$(stat -c %s "$ACTUAL")" -gt $((32 * 1024 * 1024)) ]; then gzip -c "$ACTUAL" >"$ACTUAL.$(date +%Y%m%d-%H%M).gz" && : >"$ACTUAL" ls -1t "$ACTUAL".*.gz 2>/dev/null | tail -n +5 | xargs -r rm -f # se quedan los 4 más nuevos fi