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- di scrivere un file di istruzioni, detto "Unit File" o "Service File" e
- di inserirlo tra i servizi di sistema
Queste istruzioni hanno funzionato per me al primo colpo ed è stato il metodo che ho preferito, per diverse ragioni:
- ho un file di descrizione del servizio separato dallo script/programma/servizio vero e proprio
- 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)
- poter continuare a sviluppare e fare i test in una directory a piacimento,
- poter arrestare e riavviare il servizio con i comandi standard di Linux (systemctl)
Nessun commento:
Posta un commento