Servizio Raspberry su systemd
Per eseguire un codice in automatico all’avvio della Raspberry ci sono diversi modi. Uno dei metodi più facili è quello di utilizzare il TAG @reboot su crontab per l’esecuzione dello script dopo il riavvio della Raspberry, oppure l’esecuzione ad intervalli di tempo regolari.
Ma sa vogliamo creare un vero e proprio servizio che viene eseguito all’avvio, consideri le dipendenze e continui a funzionare in background dobbiamo utilizzare systemd.
Systemd
Systemd è un init system (processo Unix eseguito subito dopo il bootstrap: Approfondimenti…) utilizzato nelle distribuzioni linux per avviare lo stpazio utente e gestire i processi del sistema dopo l’avvio.
Include una raccolta di strumenti per diversi compiti ma lo scopo principale è quello di inizializzare, gestire e tenere traccia dei servizi di sistema e dei demoni sia all’avvio che durante il funzionamento del sistema operativo.
Creiamo un servizio per il raffreddamento della CPU
Per fare un esempio pratico che possa anche tornare utile sulle nostre Raspberry proviamo a scrivere un programma che avvii la ventola di raffreddamento della CPU superata una certa temperatura e la fermi quando scende.
Per semplicità facciamo uno script bash che ogni trenta secondi verifica la temperatura della CPU e se supera i 50 °C attiva la porta GPIO 2 facendo partire la ventolina di raffreddamento (maggiori dettagli sui componenti necessari e su come fare il circuito li vedremo in un altro articolo).
Script BASH
Nello script bash impostiamo 50 °C (TEMP=50000) come soglia di accensione / spegnimento ed un intervallo di aggiornamento di 15 secondi (sleep 15).
#!/bin/bash CPU=$(</sys/class/thermal/thermal_zone0/temp) TEMP=50000 echo "2" > /sys/class/gpio/export echo out > /sys/class/gpio/gpio2/direction echo 0 > /sys/class/gpio/gpio2/value STATUS=0 while : do CPU=$(</sys/class/thermal/thermal_zone0/temp) MHZ=$(</sys/devices/system/cpu/cpu0/cpufreq/cpuinfo_cur_freq) echo "$(date)" echo "FAN: $STATUS" echo "CPU: $((CPU/1000))'C" echo "GPU: $(/opt/vc/bin/vcgencmd measure_temp)" echo "MHZ: $((MHZ/1000))" if [ "$CPU" -gt "$TEMP" ]&&[ "$STATUS" -lt 1 ] then STATUS=1 echo "devo accendere la ventola $CPU | $TEMP | $STATUS " echo "1" > /sys/class/gpio/gpio2/value elif [ "$CPU" -lt "$TEMP" ]&&[ "$STATUS" -gt 0 ] then STATUS=0 echo "devo spegnere la ventola $CPU | $TEMP | $STATUS " echo "0" > /sys/class/gpio/gpio2/value fi sleep 15 done
Lo script è disponibile anche su GitHub: https://bit.ly/2LiWkaA
Per eseguirlo basta lanciare il comando sudo bash CPUTemp.sh:
Creazione del servizio
Per convertire il nostro script in un vero e proprio servizio ci basta scrivere lo script .service qui sotto in questo percorso: /lib/systemd/system .
[Unit] Description=Raspberry temperatura e ventola After=network-online.target [Service] ExecStart=/bin/bash /home/pi/scripts/CPUTemp.sh WorkingDirectory=/home/pi/scripts/ StandardOutput=inherit StandardError=inherit Restart=always User=pi [Install] WantedBy=multi-user.target
Testiamo il servizio
Per vedere se il servizio funziona correttamente dobbiamo provare a lanciarlo manualmente con il comando:
sudo systemctl start CPUTemp.service
Per poi verificare lo stato del servizio con il comando:
sudo systemctl status CPUTemp.service
Il risultato dovrebbe essere come il seguente:
A questo punto possiamo fermarlo con il comando:
sudo systemctl stop CPUTemp.service
Fatto questo e verificato che il servizio funzioni correttamente dobbiamo solo registrarlo in modo che parta in automatico all’avvio con questo comando:
sudo systemctl enable CPUTemp.service
Fonti:
https://domoticproject.com/creating-raspberry-pi-service/
https://www.raspberrypi.org/documentation/usage/gpio/
https://raspberrypi-aa.github.io/session2/bash.html
https://wiki.debian.org/it/systemd
Spero che questo articolo ti sia stato utile, se hai avuto problemi oppure vuoi approfondire meglio qualche particolare scrivimi un commento o condividi l’articolo con persone che potrebbero trovarlo utile.
GRAZIE!!!
Articolo molto interessante!!!
Grazie!!!
Ottimo articolo,molto esaustivo.
Grazie
Emanuele
Grazie Emanuele,
Fa piacere ricevere feedback!