surveillance-temperature.sh

Raspberry Pi Compute Module 4 (CM4, 2020) — Board Sheet · File : surveillance-temperature.sh · Language : Bash · Use case : Surveiller la température du processeur et alerter en cas de chauffe

With zero dependencies, this script reads the thermal sensor exposed by the Linux kernel, logs CPU temperature and frequency to CSV and prints an alert past a threshold. Perfect to size passive cooling.

Hardware required

A Compute Module 4 (BCM2711) on its Compute Module IO Board, powered by 5 V USB-C, running 64-bit Raspberry Pi OS (Bookworm). None: the board measures its own temperature (SoC sensor).

Wiring

No wiring. Check /sys/class/thermal/thermal_zone*/temp exists (otherwise load the SoC thermal module).

How it works

The kernel exposes temperature in milli-°C in sysfs; the script converts it, compares with the threshold and appends a timestamped CSV line. The current frequency confirms thermal throttling. On Bookworm: sudo apt install python3-gpiozero (libgpiod backend) then python3 your_script.py. GPIOs follow the BCM numbering of the 40-pin header.

Going further

Add forced cooling (pwm-fan in sysfs), or push the CSV to a server with curl in the same 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

← Back to the board