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:

Servizio Raspberry su systemd

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!!!