Come eseguire un programma Linux all’avvio con systemd

È necessario 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 oggigiorno, compreso Ubuntu. Ti guideremo attraverso il processo di creazione di un servizio integrato e parlerà anche al 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.

Programmi in esecuzione 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 questo stesso comportamento con i tuoi programmi e script, o in effetti qualsiasi altro programma presente sul tuo computer.

I programmi che vengono lanciati all’avvio sono controllati da systemd, il sistema e servizio manager. systemd è il primo processo da eseguire all’avvio. Lo è sempre stato ID processo (PID) 1. Ogni altro processo in esecuzione nel computer viene avviato da systemd o da un processo già avviato da systemd.

Vengono chiamati i programmi che vengono eseguiti in background demoni o servizi. La “d” alla fine di systemd sta per daemon. 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 utilizzando systemctl, il interfaccia di controllo per systemd
Capace di scrivere sulla rivista

Creazione del programma di servizio

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

touch htg.sh
gedit htg.sh

toccare htg.sh in una finestra di terminale

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

#!/bin/bash

echo "htg.service: ## Starting ##" | systemd-cat -p info

while :
do
TIMESTAMP=$(date '+%Y-%m-%d %H:%M:%S')
echo "htg.service: timestamp ${TIMESTAMP}" | systemd-cat -p info
sleep 60
done

Salva le modifiche e chiudi l’editor.

htg.sh nell'editor gedit

La sceneggiatura non fa molto, ma ci sono alcuni punti che vale la pena notare.

Le due linee di eco vengono convogliate attraverso systemd-cat, un programma che accetta l’estensione output da un programma e lo invia al journal. Le voci al giornale hanno la priorità. Stiamo usando l’opzione -p (priorità) per indicare che i nostri messaggi sono solo per informazione (info). Non sono errori o avvertimenti importanti.
C’è un ciclo while infinito.
La variabile TIMESTAMP è impostata sulla data e l’ora correnti. Viene formattato in un messaggio e inviato al diario.
Lo script quindi rimane inattivo per 60 secondi.
Dopo 60 secondi il ciclo viene ripetuto. Quindi, questo script scrive un messaggio con timestamp nel journal una volta al minuto.

Copieremo lo script nella directory / usr / local / bin.

sudo cp htg.sh /usr/local/bin

sudo cp htg.sh / usr / local / bin in una finestra di terminale

E dobbiamo renderlo eseguibile:

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

sudo chmod + x /usr/local/bin/htg.sh in una finestra di terminale

Creazione del file dell’unità di servizio

Ogni programma avviato da systemd ha un file di definizione, chiamato file di 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

sudo systemctl list-unit-files --type-service in una finestra di terminale

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

Elenco dei file di unità di systemd in una finestra di terminale

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

sudo gedit /etc/systemd/system/htg.service in una finestra di terminale

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

[Unit]
Description=winadmin.it Service Example

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

[Service]
Type=simple
ExecStart=/usr/local/bin/htg.sh
Restart=on-failure
RestartSec=10
KillMode=process

[Install]
WantedBy=multi-user.target

Salva le modifiche e chiudi l’editor.

htg.service unit file nell'editor gedit

Le voci hanno questi significati. Queste sono voci tipiche. Il nostro semplice servizio in realtà non necessita della maggior parte di essi, ma includerli ci consente di spiegarli.

Descrizione: questa è una descrizione testuale del tuo servizio.
Vuole: il nostro servizio desidera, ma non richiede, che la rete sia attiva prima che il nostro servizio venga avviato.
Dopo: un elenco di nomi di unità che dovrebbero 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 sarà stato forkato.
ExecStart: il percorso del processo che dovrebbe essere avviato.
Riavvia: quando e se il servizio deve essere riavviato. Lo abbiamo impostato su “in caso di fallimento”.
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 arrestare il servizio. Abbiamo questa impostazione 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 imposteremo su “misto” per garantire che anche tutti i processi generati vengano terminati.
WantedBy: abbiamo questa impostazione 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 dalla disponibilità di un’interfaccia utente grafica.

Il file unit non deve essere eseguibile, ma i permessi sul file unit dovrebbero limitare chi può modificarlo. Non vuoi che un utente malizioso o malizioso cambi il file 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 per il gruppo. Altri non avranno autorizzazioni.

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

sudo chmod 640 /etc/systemd/system/htg.service in una finestra di terminale

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

systemctl status htg.service

systemctl status htg.service in una finestra di terminale

Nessun errore è evidenziato, il che significa che il nostro file di unità è sintatticamente corretto.

Avvio del servizio

Quando si aggiunge un nuovo file di unità o si modifica uno esistente, è necessario dire a systemd di ricaricare le definizioni del file di unità.

sudo systemctl daemon-reload

Se vuoi che un servizio venga lanciato all’avvio devi abilitarlo:

sudo systemctl enable htg

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

sudo systemctl start htg

sudo systemctl daemon-reload in una finestra di terminale

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

sudo systemctl status htg.service in una finestra di terminale

Lo stato del servizio viene visualizzato per noi.

Stato di htg.service in un terminale widnow

Il punto verde indica che il nostro servizio è attivo e funziona senza problemi.
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 in cui è stato avviato viene elencata per noi.
Il suo PID è 7762.
Ci sono due attività associate al servizio.
Un totale di 928 Kibibyte di memoria vengono utilizzati dal servizio.
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 farà il lavoro per questo servizio.

Ci 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

sudo systemctl stop htg.service in una finestra di terminale

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

sudo systemctl disable htg.service

sudo systemtctl disabilita htg.service in una finestra di terminale

Se il servizio è in esecuzione, questo comando non lo interrompe. Dice semplicemente a systemd di non avviare il servizio al successivo 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.