In questo articolo cercheremo di spiegare come creare programmi in autostart su Raspberry con l’utilizzo di systemd, systemctl, ed altre tips.
Le modalità per creare un programma che venga lanciato in batch alla partenza del nostro Raspberry PI costituisce da sempre il sacro Graal dei programmatori di sistema (e non). Alcuni si affidano a cron, che però differisce in alcune caratteristiche di Raspberry os rispetto al canonico Ubuntu, creando non pochi grattacapi. Inoltre spesso quel che desideriamo non è un programma che parta a una determinata ora del giorno, o alla scadenza dei 73 minuti, o tutti i mercoledì, bensì (molto più semplicemente, all’attivazione del nostro Raspberry.
Esistono diversi modi per ottenere un simile effetto. Oggi prenderemo in esame i più comuni.
Systemd
Questo è il metodo più utilizzato per lanciare un programma al boot di sistema, ma anche il più complesso, ed ha un punto negativo rilevante. Systemd attualmente rimpiazza e rende obsoleti i metodi basati su rc.local e init.d.
Systemd è il metodo per lanciare un programma al boot di Raspberry PI, ed ecco il problema: non rende possibile lanciare al boot un programma desktop, che cioè richieda l’interfaccia grafica (come ad esempio OpenOffice). Per tale attività occorre utilizzare la funzione di autostart (che vedremo in seguito).
1 2 3 4 5 6 7 8 9 10 11 12 |
[Unit] Description=Save IP address Documentation=https://wp.me/p80TdZ-4EP After=network-online.target [Service] ExecStart=/bin/sh -c "ifconfig > /boot/MioPing.txt" [Install] WantedBy=network-online.target |
Il primo step nel processo systemd consiste nel creare un service file (ne abbiamo parlato in un precedente articolo). Per creare un service file occorre innanzi tutto creare un file con estensione .service, qindi dividerlo all’interno in tre sezioni: Unit, Service e Install. Ovviamente ciascuna di queste sezioni dispone di numerose opzioni, ed una analisi approfondita esula dalla trattazione qui esposta. Nel caso specifico, quel che ci occorre sapere è dove porre il nostro programma da eseguire: la linea ExecStart contiene esattamente questo parametro. Nel caso specifico, il “processo” lanciato al boot apre una shell, il flag -c significa “interpreta la stringa che segue come un comando di shell”. All’interno della stringa inseriamo un comando che recuperi le caratteristiche di rete della nostra macchina e rediriga l’output in un file. Notare che la sezione Install prevede che la rete sia attiva per poter eseguire il servizio.
Installazione
Ora che il file è pronto, possiamo spostarlo nella directory systemd
1 |
sudo mv mioprogramma.service /lib/systemd/system/mioprogramma.service |
e dargli i corretti permessi di esecuzione con
1 |
sudo chmod 744 mioprogramma.service |
Una volta terminata l’installzione, è possibile utilizzare il comando “service” per attivare il nostro nuovo servizio:
1 |
sudo systemctl enable mioprogramma.service |
Una volta abilitato il nuovo servizio, eseguiamo un bel reboot. Alla ripartenza potremo controllare lo stato del nostro servizio attraverso lo stesso comando
1 |
sudo systemctl status mioprogramma.service |
Il comando ci offrirà la descrizione del nostro programma, mostrandoci se sia stato caricato correttamente, ed il suo stato attuale: se il programma è stato scritto per girare in background risulterà “active”, se invece (come il presente script) viene lanciato una volta all’avvio fermandosi subito dopo, risultarà “inactive”. Sarà anche presente una sezione relativa alla documentazione, che conterrà quanto promesso (nel caso specifico, un link a questo articolo).
Infine se desiderate disabilitare il servizio, per fare in modo che il vostro programma non parta più al boot di sistema, aprite una shell o un terminale e digitate
1 |
sudo system disable mioprogramma.service |
Una volta disabilitato il servizio, conviene sempre controllare che la disabilitazione sia avvenuta, effettuando un reboot e controllando lo status del servizio.
Troubleshooting
Cosa fare se il servizio non parte correttamente, visto che il tutto è automatizzato e nulla viene scritto a console?
La risposta è un altro utile comando del sistema operativo, journalctl. Questo comando ci permette di leggere il registro (journal log) delle azioni che hanno riguardato il nostro sistema, ed è di solito piuttosto corposo. Per leggerlo correttamente da terminale occorre esterndere la larghezza del terminale in modo da poter stampare le righe complete dei messaggi. Poi, possiamo utilizzare <PgUp> e <PgDn> per navigare all’interno edl terminale, premere <Home> (o il tasto <) e il tasto <End> (o il tasto >) per tornare rispettivamente all’inizio o spostarci al termine del file, ed utilizzare i classici comandi di ricerca per trovare il nome del nostro servizio, e vedere quale sorte abbia avuto prima, durante e dopo il lancio.
Per eseguire una ricerca testuale all’interno del terminale è sufficiente digitare il carattere slash (‘/’) seguito dalla stringa di ricerca. premendo ‘n’ si cerca una nuova occorrenza, premendo ‘p’ si torna alla precedente. Premendo ‘q’ si esce dal programma.
Infine, se si desidera filtrare solo le righe con i log di errore lanciate dal sistema, è possibile usaer il seguente comando:
1 |
journalctl -b 0 -p err |
Join our groups on Telegram…