Avvio automatico applicazioni
Raspberry
Chiunque usa una Raspberry sicuramente si sarà cimentato nella scrittura di script in Python, C++ o bash, per controlare GPIO, sensori, avviare programmi che usano la rete internet, ecc. Sicuramente ci sarà la necessità di avviare il programmino o lo script in automatico all’accensione del RPi. In questa pagina vedremo come fare per avviare un programma od uno script in automatico, ed addirittura creare un log di eventuali errori.
Attenzione!
Il software verrà avviato durante la fase di avvio del sistema operativo, ancor prima dell’interfaccia grafica e del caricamento di alcuni driver o software, come ad esempio il driver per il Wi-Fi, e driver specifici per hardware di terze parti, o demoni e server; quindi se il programma utilizza ad esempio USB o si connette ad internet, potrebbe bloccarsi e restituire errore, poichè il sistema operativo non ha ancora finito di connettersi ed autenticarsi ad una rete Wi-Fi, o caricato i driver della scheda audio USB, o del Bluetooth.
Per ovviare a questo problema, verrà indicata una soluzione.
Creare uno Launcher Script
Bisognerà creare un file bash con all’interno i comandi, bash appunto, da eseguire all’avvio del sistema. Questo file deve stare nella cartella del programmino da avviare:
sudo nano launcher.sh
In questo file inseriamo i comandi:
cd /
cd home/pi/VOSTRACARTELLA
sleep 200
sudo python VOSTROPROGRAMMA.py
cd /
E’ possibile facilmente capire cosa andiamo a comandare, in ordine:
- innanzi tutto si va nella cartella principale “home”
- poi a seguire ci si sposta nella cartella del programma o script
- a questo punto si può scegliere se far attendere il sistema prima di lanciare il programma o script. Può essere necessario, come detto nell’introduzione dell’articolo, se il programma in questione fa uso di driver o della rete internet. Poiché viene lanciato durante la fase di avvio dell’intero sistema, probabilmente alcuni driver potrebbero non essere stati ancora caricati, oppure non si è ancora connessi ed autenticati alla rete Wi-Fi, o ancora servizi come server o demoni, potrebbero non essere ancora pronti.
- La soluzione è quella di far “dormire” per un tempo a scelta lo script, con l’istruzione sleep, nel mio caso di esempio ho impostato 200 secondi, tempo ampiamente sufficiente per risolvere la problematica poc’anzi descritta.
- finalmente, si può dare il comando che avvia il programma o script, esso va dato così come lo si darebbe nel terminale. Il comando sudo è facoltativo.
Chiudere con CTRL+X e confermare il salvataggio.
Autoriziamo lo script
sudo chmod 755 launcher.sh
Eseguiamo lo script per vedere se è tutto OK, il programma dovrebbe avviarsi (tenere in considerazione l’evenutale tempo di ritardo impostato):
sh launcher.sh
Creiamo una cartella di log.
In questa cartella verrà scritto un file di log, in cui verranno riportati eventuali errori occorsi durante lo svolgimento del programma.
cd
sudo mkdir logs
Aggiungiamo l’evento a Crontab
Nei sistemi operativi Unix e Unix-like, il comando crontab consente la pianificazione di comandi, ovvero consente la registrazione di questi presso il sistema per essere poi mandati in esecuzione periodicamente in maniera automatica dal sistema stesso. Lo stesso nome «crontab» si riferisce anche ai file utilizzati dal comando crontab come «registri» dei comandi pianificati.
Generalmente, crontab usa un demone, chiamato crond, che in quanto tale è costantemente in esecuzione in background e, una volta al minuto, legge i contenuti del registro dei comandi pianificati ed esegue quelli per cui si è esaurito il periodo di attesa. Un comando mandato in esecuzione da crontab viene chiamato cronjob.
crontab -e
aggiungiamo alla fine del file “crontab” la seguente stringa:
@reboot sh /home/pi/VOSTRACARTELLA/launcher.sh
Questa istruzione sta ad indicare che ad ogni avvio del computer viene avviato il launcher specificato. Se si vuole salvare in un file tutto quello che accade nel terminale, bisognerà aggiungere una parte al comando:
@reboot sh /home/pi/VOSTRACARTELLA/launcher.sh > /home/pi/logs/cronlog 2>&1
Riavvio e collaudo
Bene! Ora è tutto pronto. Riavviando il sistema, il programma si avvierà:
sudo reboot
Ora il programma inizierà a girare e a funzionare regolarmente, anche se nessuna finestra verrà visualizzata.
[adinserter name=”Solo Testo”]
Nel caso in cui il programma ha un problema e si blocca, è possibile visualizzare l’errore restituito, come se fosse stato aperto in una finestra del terminale. Bisongerà vedere cosa è successo nel log:
cd /
cd logs
cat cronlog
In caso di errori verranno visualizzati a schermo, se tutto fila liscio invece non comparirà nulla.
Un commento
Salvatore
ciao Lorenzo, potresti aiutarmi a risovere questo errore?:
ho seguito la tua guida ed ho questo risultato
sh launcher.sh
launcher.sh: 3: launcher.sh: sleep200: not found
File “./ppup1090”, line 1
SyntaxError: Non-ASCII character ‘\x87’ in file ./ppup1090 on line 2, but no encoding declared; see http://python.org/dev/peps/pep-0263/ for details
questo il file launcher.sh :
cd /
cd home/pi/ppup
sleep200
sudo python ./ppup1090 –net-pp-ipaddr 192.168.x.xxx.py
cd /
Preciso che il comando lanciato via terminale funziona bene.
e quindi non sono andato oltre.
Salvatore