surveillance-temperature.sh
Sin ninguna dependencia, este script lee el sensor térmico expuesto por el kernel Linux, registra temperatura y frecuencia de la CPU en CSV y muestra una alerta al superar un umbral. Perfecto para dimensionar la refrigeración pasiva.
Hardware
Un ODROID-N2 (Amlogic S922X, 4 Cortex-A73 + 2 Cortex-A53, 2-4 GB) con Ubuntu de Hardkernel o Armbian, con Ethernet gigabit y ranura eMMC. Ninguno: la placa mide su propia temperatura (sensor del SoC).
Cableado
Sin cableado. Comprobar que existe /sys/class/thermal/thermal_zone*/temp (si no, cargar el módulo térmico del SoC).
Funcionamiento
El kernel expone la temperatura en mili-°C en sysfs; el script la convierte, la compara con el umbral y añade una línea CSV con marca de tiempo. La frecuencia actual confirma el limitación térmica.
Ejecución
En Ubuntu de Hardkernel o Armbian: apt install gpiod python3-gpiod; en Amlogic el conector está tras el chip gpiochip1 (confírmalo con gpiodetect/gpioinfo).
Variantes
Añadir ventilación forzada (pwm-fan en sysfs), o enviar el CSV a un servidor con curl en el mismo cron.
surveillance-temperature.sh
#!/bin/bash
# Surveillance thermique : /sys/class/thermal + journalisation + alerte.
# Aucune dependance : sysfs et bash uniquement.
SEUIL_C="${SEUIL_C:-70}" # degres avant alerte (variable d'env)
INTERVALLE="${INTERVALLE:-5}" # secondes entre deux mesures
JOURNAL="${JOURNAL:-/tmp/cpu-temp.csv}"
[ -f "$JOURNAL" ] || echo "horodatage,temp_c,frequence_mhz" > "$JOURNAL"
# Premier capteur thermique expose par le noyau (varie selon la carte)
ZONE=$(ls /sys/class/thermal/ | grep ^thermal_zone | head -1)
[ -n "$ZONE" ] || { echo "aucun capteur thermique dans /sys/class/thermal"; exit 1; }
echo "Capteur : $ZONE"
while true; do
TEMP=$(($(cat /sys/class/thermal/$ZONE/temp) / 1000)) # milli-C -> C
FREQ=$(awk 'NR==1{print $1/1000}' \
/sys/devices/system/cpu/cpufreq/policy0/scaling_cur_freq 2>/dev/null || echo 0)
TS=$(date -Is)
echo "$TS,$TEMP,$FREQ" >> "$JOURNAL"
if [ "$TEMP" -ge "$SEUIL_C" ]; then
echo "$(date +%T) ALERTE : ${TEMP}C >= ${SEUIL_C}C (freq ${FREQ} MHz)"
else
echo "$(date +%T) temp ${TEMP}C freq ${FREQ}MHz"
fi
sleep "$INTERVALLE"
done