27 febbraio 2019

Raspberry Pi: avviare un servizio all'accensione

Un appunto veloce per spiegare la soluzione che ho scelto per avviare un servizio all'avvio del Raspberry, soprattutto pensando ai miei lettori italiani, che non hanno sempre voglia di tradurre o farsi tradurre le pagine in inglese.

L'obiettivo: far partire uno script in Python che funziona da servizio, cioè parte in automatico e gira all'infinito o fin quando non viene interrotto manualmente. Nel mio caso si tratta di un programma scritto da me che per ora non ha neanche una interfaccia grafica, e forse non l'avrà mai.

Cinque soluzioni

Ci sono diversi modi per arrivare al risultato, come ho potuto verificare nelle mie ricerche.
In un articolo del sito Dexter Industries, vengono elencati 5, dico cinque modi diversi:
  • rc.local
  • .bashrc
  • init.d
  • systemd
  • crontab

rc.local

Ho provato il metodo rc.local, ma ho trovato subito delle difficoltà perché lo script in Python non trovava le librerie (import) e neanche i file locali che doveva aprire.

Per vedere gli errori ho eseguito da terminale il comando inserito nel file rc.local:

sudo python /home/pi/sample.py 

In pratica il sistema operativo non aveva finito di caricare l'ambiente, o io non ero stato in grado di dargli il contesto corretto in cui far girare lo script.

init.d

Il metodo init.d perché, nell'articolo citato, mi proponeva di copiare il programma nella cartella init.d.

sudo cp /home/pi/sample.py /etc/init.d/ 

A me questo metodo non piace, perché sto facendo lo sviluppo nella mia home, e vorrei lasciare tutto lì. Non vorrei cartelle duplicate e programmi duplicati.

systemd

Questo metodo sembra un po' più lungo e complesso, perché richiede
  1. di scrivere un file di istruzioni, detto "Unit File" o "Service File" e 
  2. di inserirlo tra i servizi di sistema
In realtà è proprio il sito del Raspberry a fornire delle indicazioni dettagliate corredate da un esempio per creare il file e i comandi necessari per avviare il servizio.

Queste istruzioni hanno funzionato per me al primo colpo ed è stato il metodo che ho preferito, per diverse ragioni:
  1. ho un file di descrizione del servizio separato dallo script/programma/servizio vero e proprio
  2. la granularità del controllo, o in parole semplici, la possibilità di definire diversi parametri come la "Working Directory"e definire eventuali dipendenze (es. avvia solo dopo aver avviato la rete)
  3. poter continuare a sviluppare e fare i test in una directory a piacimento,
  4. poter arrestare e riavviare il servizio con i comandi standard di Linux (systemctl)
Buon divertimento con il Raspberry!

Nessun commento:

Posta un commento