Come eseguire un programma Linux all'avvio con systemd

Pubblicato: 2022-01-29
Una finestra stilizzata del terminale su un laptop.
Fatmawati Achmad Zaenuri/Shutterstock

Hai bisogno di avviare un programma Linux all'avvio? Il software systemd fornisce un modo per farlo su qualsiasi distribuzione Linux con systemd, che è la maggior parte di questi al giorno d'oggi, incluso Ubuntu. Ti guideremo attraverso il processo di creazione di un servizio integrato, che parlerà anche con il diario.

Questo tutorial mostra come configurare un servizio di sistema che viene avviato all'avvio del sistema. Per avviare un programma grafico quando accedi, utilizza invece il gestore di avvio del desktop.

Esecuzione di programmi all'avvio

A volte il software che installi sul tuo computer si aggancia al processo di avvio di Linux, in modo che il programma venga avviato automaticamente ogni volta che il computer viene avviato. Puoi facilmente ottenere lo stesso comportamento con i tuoi programmi e script, o in effetti con qualsiasi altro programma presente sul tuo computer.

I programmi che vengono avviati all'avvio sono controllati da systemd , dal gestore del sistema e del servizio. systemd è il primo processo da eseguire all'avvio. Ha sempre un ID processo (PID) 1. Ogni altro processo in esecuzione nel computer viene avviato da systemd o da un processo che systemd ha già avviato.

I programmi eseguiti in background sono chiamati demoni o servizi. La "d" alla fine di systemd sta per demone. In questo articolo creeremo un servizio di esempio. Per spuntare tutte le caselle, il nostro servizio deve essere:

  • Integrato con systemd tramite un file di unità di servizio
  • Lanciato all'avvio
  • Controllabile tramite systemctl , l'interfaccia di controllo per systemd
  • In grado di scrivere sul diario

Creazione del programma di servizio

Abbiamo bisogno di un programma che si avvierà systemd . Creeremo un semplice script, chiamato “htg.sh”. Questo tutorial utilizza l'editor di testo Gedit, ma puoi utilizzare qualsiasi editor di testo che preferisci.

 tocca htg.sh
 gedit htg.sh 

Annuncio pubblicitario

Si aprirà l'editor di gedit . Copia e incolla il seguente testo nell'editor.

 #!/bin/bash

echo "htg.service: ## A partire da ##" | systemd-cat -p informazioni

mentre :
fare
TIMESTAMP=$(data '+%Y-%m-%d %H:%M:%S')
echo "htg.service: timestamp ${TIMESTAMP}" | systemd-cat -p informazioni
dormire 60
fatto

Salva le modifiche e chiudi l'editor.

htg.sh nell'editor gedit

La sceneggiatura non fa molto, ma ci sono alcuni punti degni di nota.

  • Le due linee di echo vengono convogliate tramite systemd-cat , un programma che prende l'output da un programma e lo invia al journal. Le iscrizioni al giornale hanno la priorità. Stiamo usando l'opzione -p (priorità) per indicare che i nostri messaggi sono solo a scopo informativo (informazioni). Non sono errori o avvisi importanti.
  • C'è un ciclo while infinito.
  • La variabile TIMESTAMP è impostata sulla data e l'ora correnti. Questo viene formattato in un messaggio e inviato al journal.
  • Lo script viene quindi sospeso per 60 secondi.
  • Dopo 60 secondi il ciclo viene ripetuto. Quindi, questo script scrive un messaggio con timestamp nel diario una volta al minuto.

Copieremo lo script nella /usr/local/bin .

 sudo cp htg.sh /usr/local/bin 

E dobbiamo renderlo eseguibile:

 sudo chmod +x /usr/local/bin/htg.sh 

Creazione del file dell'unità di servizio

Ogni programma avviato da systemd ha un file di definizione, chiamato file dell'unità di servizio. Questo contiene alcuni attributi che systemd può utilizzare per individuare e avviare il programma e per definire alcuni dei suoi comportamenti.

Dobbiamo creare un file di unità per il nostro nuovo servizio, ma è prudente assicurarci che nessuno dei file di unità esistenti abbia il nome che vogliamo dare al nostro nuovo servizio.

 sudo systemctl list-unit-files --type-service 

È possibile scorrere l'elenco dei file unit, che è ordinato alfabeticamente, e verificare che il nome che si desidera utilizzare non sia preso.

Annuncio pubblicitario

Il nostro servizio si chiamerà "htg.service". Nessun file di unità ha quel nome, quindi possiamo procedere e creare il nostro file di unità.

 sudo gedit /etc/systemd/system/htg.service 

Si aprirà l'editor di gedit . Copia e incolla il seguente testo nell'editor:

 [Unità]
Description=Esempio di servizio geek How-To

Vuole=network.target
After=syslog.target network-online.target

[Servizio]
Tipo=semplice
ExecStart=/usr/local/bin/htg.sh
Riavvio=in caso di errore
RiavviaSec=10
KillMode=processo

[Installare]
WantedBy=multiutente.target

Salva le modifiche e chiudi l'editor.

htg.service file dell'unità nell'editor gedit

Le voci hanno questi significati. Queste sono voci tipiche. Il nostro semplice servizio in realtà non ne richiede la maggior parte, ma includerli ci permette di spiegarli.

  • Descrizione: questa è una descrizione testuale del tuo servizio.
  • Desidera: il nostro servizio vuole, ma non richiede, che la rete sia attiva prima dell'avvio del servizio.
  • Dopo: un elenco di nomi di unità che devono essere avviati dopo che questo servizio è stato avviato correttamente, se non sono già in esecuzione.
  • Tipo: semplice. systemd considererà questo servizio avviato non appena il processo specificato da ExecStart è stato biforcato.
  • ExecStart: il percorso del processo che deve essere avviato.
  • Riavvia: quando e se il servizio deve essere riavviato. L'abbiamo impostato su "in caso di guasto".
  • RestartSec: quanto tempo attendere prima di tentare di riavviare il servizio. Questo valore è in secondi.
  • KillMode: definisce come systemd dovrebbe terminare il processo se chiediamo a systemctl di interrompere il servizio. Abbiamo questo set per "elaborare". Ciò fa sì che systemd utilizzi il segnale SIGTERM solo sul processo principale. Se il nostro servizio fosse un programma non banale invece di un semplice script, lo imposteremmo su "misto" per garantire che anche tutti i processi generati vengano terminati.
  • WantedBy: Abbiamo questo set su "multi-user.target", il che significa che il servizio deve essere avviato fintanto che il sistema è in uno stato in cui più utenti possono accedere, indipendentemente dal fatto che sia disponibile o meno un'interfaccia utente grafica.

Non è necessario che il file di unità sia eseguibile, ma le autorizzazioni sul file di unità dovrebbero limitare chi può modificarlo. Non vuoi che un utente maligno o dispettoso modifichi il file dell'unità in modo che esegua un programma completamente diverso.

Questo comando darà al proprietario le autorizzazioni di lettura e scrittura e le autorizzazioni di lettura al gruppo. Gli altri non avranno permessi.

 sudo chmod 640 /etc/systemd/system/htg.service 

Possiamo fare in modo che systemctl controlli per noi la sintassi del nostro file unit, anche se il servizio non è ancora in esecuzione. Eventuali errori verranno segnalati. (In realtà, la parte ".service" è facoltativa per la maggior parte dei comandi.)

 stato systemctl htg.service 

Annuncio pubblicitario

Non vengono evidenziati errori, il che significa che il nostro file unit è sintatticamente corretto.

Avvio del servizio

Quando aggiungi un nuovo file di unità o ne modifichi uno esistente, devi dire a systemd di ricaricare le definizioni del file di unità.

 sudo systemctl daemon-reload

Se vuoi che un servizio venga avviato all'avvio devi abilitarlo :

 sudo systemctl abilita htg

L'abilitazione di un servizio non lo avvia, ma ne imposta solo l'avvio all'avvio. Per avviare il servizio ora , è necessario utilizzare systemctl con l'opzione di start .

 sudo systemctl start htg 

Verifica del servizio

Dopo aver avviato manualmente il servizio o dopo aver riavviato il computer, possiamo verificare che il nostro servizio funzioni correttamente.

 sudo systemctl status htg.service 

Lo stato del servizio viene visualizzato per noi.

Stato di htg.service in una finestra di terminale

  • Il punto verde indica che il nostro servizio è attivo e funzionante senza intoppi.
  • Il nome del servizio è “htg.service” e la descrizione lunga è quella che abbiamo fornito nel file unit.
  • Ci viene mostrato quale file di unità è stato caricato "/etc/systemd/system/htg.service".
  • Il servizio è attivo e l'ora di avvio del servizio è indicata per noi.
  • Il suo PID è 7762.
  • Ci sono due attività associate al servizio.
  • Il servizio utilizza un totale di 928 Kibibyte di memoria.
  • Il gruppo di controllo include lo script "htg.sh" e il comando sleep , che è stato lanciato da "htg.sh". Il più delle volte, il comando sleep eseguirà il lavoro per questo servizio.

Vengono anche mostrate le ultime 10 voci di diario prodotte da questo servizio. Non sorprende che siano tutti a un minuto di distanza.

Arresto e disabilitazione del servizio

Se devi interrompere il servizio, puoi farlo con questo comando:

 sudo systemctl stop htg.service 

Annuncio pubblicitario

Ciò interrompe il servizio, ma non impedisce il riavvio successivo del computer. Per interrompere l'avvio del servizio all'avvio, è necessario disabilitarlo :

 sudo systemctl disabilita htg.service 

Se il servizio è in esecuzione, questo comando non lo interrompe. Dice semplicemente a systemd di non avviare il servizio al prossimo riavvio.

Se desideri interrompere il servizio e impedirne l'avvio all'avvio, utilizza entrambi i comandi.

Suggerimento di servizio

Assicurati che il tuo programma funzioni come previsto prima di provare ad avviarlo come servizio.

CORRELATI: I migliori laptop Linux per sviluppatori e appassionati