Lanciare processi all’avvio di Raspberry – systemd

Raspberry journalctl

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).

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

e dargli i corretti permessi di esecuzione con

Una volta terminata l’installzione, è possibile utilizzare il comando  “service” per attivare il nostro nuovo servizio:

Una volta abilitato il nuovo servizio, eseguiamo un bel reboot. Alla ripartenza potremo controllare lo stato del nostro servizio attraverso lo stesso comando

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

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:

 

 

 

Join our groups on Telegram…

… and don’t forget our social channels!

Definire ciò che si è non risulta mai semplice o intuitivo, in specie quando nella vita si cerca costantemente di migliorarsi, di crescere tanto professionalmente quanto emotivamente. Lavoro per contribuire al mutamento dei settori cardine della computer science e per offrire sintesi ragionate e consulenza ad aziende e pubblicazioni ICT, ma anche perche’ ciò che riesco a portare a termine mi dà soddisfazione, piacere. Così come mi piace suonare (sax, tastiere, chitarra), cantare, scrivere (ho pubblicato 350 articoli scientfici e 3 libri sinora, ma non ho concluso ciò che ho da dire), leggere, Adoro la matematica, la logica, la filosofia, la scienza e la tecnologia, ed inseguo quel concetto di homo novus rinascimentale, cercando di completare quelle sezioni della mia vita che ancora appaiono poco ricche.

Leave a Reply

This site uses Akismet to reduce spam. Learn how your comment data is processed.