journal-cron.sh

NanoPi R5S (FriendlyElec) · Archivo : journal-cron.sh · Lenguaje : Bash · Uso : Journaliser une mesure toutes les minutes avec cron

El dúo cron + script corto es el automatizador universal de Linux: cada minuto, carga de CPU y temperatura se añaden a un CSV con rotación integrada. Cero dependencias, cero demonios, sobrevive reinicios solo.

Hardware

Un NanoPi R5S (Rockchip RK3568B2, 4 Cortex-A55, 2-4 GB) con FriendlyCore/Ubuntu, un router con 1× GbE WAN + 2× 2,5 GbE LAN y M.2 NVMe. Ninguno: las medidas salen de la propia placa.

Cableado

Sin cableado. Comprobar que cron (o cronie) está instalado y arrancado en la distribución usada.

Funcionamiento

cron ejecuta el script a hora fija; el script lee /proc y sysfs, añade una línea CSV y trunca pasadas 100 000 líneas para acotar el almacenamiento.

Ejecución

En FriendlyCore: apt install gpiod python3-gpiod; el conector GPIO sigue el pinout FriendlyElec del R5S; identifica el chip con gpiodetect y el número de línea con gpioinfo.

Variantes

Enviar el CSV a un servidor (curl -T), o sustituir cron por un temporizador systemd (OnUnitActiveSec=60) para journalctl integrado.

journal-cron.sh

#!/bin/bash
# Mesure ponctuelle appelee par cron (ici toutes les minutes).
# Installation :
#   sudo cp journal-cron.sh /usr/local/bin/mesure-cart.sh
#   sudo chmod +x /usr/local/bin/mesure-cart.sh
#   (crontab -e) puis :  * * * * * /usr/local/bin/mesure-cart.sh

JOURNAL="/var/log/mesure-cart.csv"
[ -f "$JOURNAL" ] || echo "horodatage,charge,temp_c" > "$JOURNAL"

# 1) Charge moyenne (1 minute) depuis /proc/loadavg
CHARGE=$(awk '{print $1}' /proc/loadavg)

# 2) Temperature SoC (tolere l'absence du capteur)
TEMP="NA"
for z in /sys/class/thermal/thermal_zone*/temp; do
  [ -r "$z" ] && TEMP=$(( $(cat "$z") / 1000 )) && break
done

# 3) Ligne CSV horodatee, append atomique
echo "$(date -Is),$CHARGE,$TEMP" >> "$JOURNAL"

# 4) Rotation maison : garder ~100 000 lignes (~70 jours a la minute)
if [ "$(wc -l < "$JOURNAL")" -gt 100000 ]; then
  tail -n 50000 "$JOURNAL" > "$JOURNAL.tmp" && mv "$JOURNAL.tmp" "$JOURNAL"
fi

← Volver a la ficha