Come eseguire un programma Linux all'avvio con systemd

Contenuti

Una finestra terminale stilizzata su un laptop.

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 loro in questi giorni, incluso Ubuntu. Ti guideremo attraverso la procedura di creazione di un servizio integrato, e anche parlare con la rivista.

Questo tutorial mostra come configurare un servizio di sistema che si avvia all'avvio del sistema. Per avviare un programma di grafica al login, usa il tuo gestore di avvio desktop.

Esecuzione di programmi all'avvio

Qualche volta, il software che installi sul tuo computer si aggancia alla procedura di avvio di Linux, quindi il programma si avvia automaticamente ogni volta che si avvia il computer. Puoi facilmente ottenere questo stesso comportamento con i tuoi programmi e script, o in realtà con qualsiasi altro programma che è sul tuo computer.

I programmi che vengono lanciati all'avvio sono controllati da systemd, il sistema e servizio manager. systemd è la prima procedura che viene eseguita all'avvio. ha sempre identificazione del processo (PID) 1. Tutti gli altri processi in esecuzione sul computer vengono avviati da systemd, o con una procedura che systemd è già iniziato.

Vengono chiamati i programmi che vengono eseguiti in background dannazione o servizi. Il “D” alla fine di systemd significa daemon. In questo post, creeremo un servizio di esempio. Per selezionare tutte le caselle, il nostro servizio deve essere:

  • Integrato con systemd tramite un file dell'unità di servizio
  • Lanciato all'avvio
  • Controllabile usando systemctl, il interfaccia di controllo di systemd
  • In grado di scrivere sulla rivista

Creazione del programma di servizio

Abbiamo bisogno di avere un programma che systemd lo preparo io. Creeremo un semplice script, chiamato “htg.sh”. Questo tutorial utilizza l'editor di testo Gedit, ma è possibile utilizzare l'editor di testo di propria scelta.

htg.sh tattile
gedit htg.sh

il gedit Si aprirà l'editor. Copiare e incollare il testo seguente nell'editor.

#!/bin/bash

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

while :
do
TIMESTAMP=$(data '+%Y-%m-%d %H:%m:%S')
eco "htg.service: Timestamp ${TIMESTAMP}" | systemd-cat -p info
sleep 60
fatto

Salva le modifiche e chiudi l'editor.

htg.sh script nell'editor gedit

Lo script non fa molto, ma ci sono alcuni punti che sono importanti da notare.

  • Entrambi echo le linee sono incanalate attraverso systemd-cat, un programma che prende il uscire da un programma e inviarlo al journal. Le voci del diario hanno la priorità. Stiamo usando il -p Opzione (priorità) per indicare che i nostri messaggi sono solo a scopo informativo (Informazioni). Non sono errori o avvertimenti importanti.
  • C'è un infinito while cerchio.
  • il TIMESTAMP La variabile è impostata sulla data e l'ora correnti. Questo è formattato in un messaggio e inviato alla rivista.
  • Dopo, lo script dorme per 60 secondi.
  • Dopo 60 secondi, il ciclo si ripete. Perché, questo script scrive un messaggio con data e ora al diario una volta al minuto.

Copiamo lo script in /usr/local/bin directory.

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 ha alcuni attributi che systemd è possibile utilizzare per individuare e avviare il programma, e per stabilire parte del loro comportamento.

Dobbiamo creare un file unitario per il nostro nuovo servizio, ma è saggio assicurarsi 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 dell'unità, che è in ordine alfabetico, e controlla che il nome che vuoi usare non sia usato.

Il nostro servizio sarà chiamato “htg.service”. Nessun file di unità ha quel nome, in modo che possiamo andare avanti e creare il nostro file di unità.

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

il gedit Si aprirà l'editor. Copiare e incollare il testo seguente nell'editor:

[Unità]
Description=How-To Geek Service Example

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

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

[Installare]
WantedBy=multi-user.target

Salva le modifiche e chiudi l'editor.

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

Le voci hanno questi significati. Queste sono voci tipiche. Il nostro semplice servizio non ha davvero bisogno della maggior parte di loro, ma includerli ci permette di spiegarli.

  • Descrizione: Questa è una descrizione testuale del tuo servizio.
  • Vuole: Il nostro servizio vuole, ma non hai bisogno, che la rete sia attivata prima dell'inizio del nostro servizio.
  • Dopo: Un elenco di nomi di unità che devono essere avviati dopo che questo servizio è stato avviato con successo, se non sono ancora in esecuzione.
  • scrive: Semplice. systemd considererà questo servizio avviato non appena la procedura specificata da ExecStart ha biforcato.
  • ExecStart: Il percorso verso la procedura da avviare.
  • Ricomincia: Quando e se il servizio deve essere riavviato. Lo abbiamo configurato in “in caso di guasto”.
  • RiavviaSec: Quanto tempo aspettare prima di provare a riavviare il servizio. Questo valore è in secondi.
  • KillMode: Impostato come systemd dovrebbe uccidere la procedura se lo chiediamo systemctl per interrompere il servizio. Abbiamo questo set up per “processo”. Questo causa systemd utilizzare il SIGTERM segnale solo nella procedura principale. Se il nostro servizio fosse un programma non banale invece di un semplice script, lo configureremmo come “misto” per assicurarsi che anche tutti i processi generati siano terminati.
  • Ricercato per: Abbiamo questa impostazione in "multi-user.target", il che significa che il servizio dovrebbe avviarsi ogni volta che il sistema si trova in uno stato in cui più utenti possono accedere, se è disponibile o meno un'interfaccia utente grafica.

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

Questo comando darà al proprietario i permessi di lettura e scrittura, e leggi i permessi per il gruppo. Altri non avranno i permessi.

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

Possiamo avere systemctl controlla la sintassi del nostro file unit per noi, anche se il servizio non è ancora attivo. Eventuali errori verranno segnalati. (In realtà, la parte “.servizio” è facoltativo per la maggior parte dei comandi).

stato systemctl htg.service

Gli errori non sono evidenziati, il che significa che il nostro file di unità è sintatticamente corretto.

Avvia il servizio

Quando aggiungi un nuovo file di unità o ne modifichi uno esistente, deve informare systemd per ricaricare le definizioni dal file dell'unità.

sudo systemctl demone-reload

Se vuoi che un servizio venga lanciato all'avvio, deve abilitare Quello:

sudo systemctl abilita htg

L'abilitazione di un servizio non lo avvia, basta impostarlo per l'avvio all'avvio. Per avviare il servizio Ora, devi usare systemctl con il start opzione.

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

Viene mostrato lo stato del servizio.

Stato di htg.service in un terminale widnow

  • Il punto verde indica che il nostro servizio sta funzionando senza intoppi.
  • Il nome del servizio è "htg.service", e la descrizione lunga è quella che forniamo nel file dell'unità.
  • Ci viene mostrato quale file di unità è stato caricato “/etc/systemd/system/htg.service”.
  • Il servizio è attivo e viene indicata l'ora in cui è stato lanciato.
  • Il tuo PID è 7762.
  • Ci sono due compiti associati al servizio.
  • Un totale di 928 Kibibyte di Memoria sono utilizzati dal servizio.
  • Il gruppo di controllo include lo script “htg.sh” e il sleep comando, che è stato rilasciato da “htg.sh”. La maggior parte delle volte, sleep comando farà il lavoro per questo servizio.

Inoltre, l'ultima 10 voci di diario prodotte da questo servizio. Come potremmo aspettare?, tutti sono separati da un minuto.

Arresto e disattivazione del servizio

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

sudo systemctl stop htg.service

Questo interrompe il servizio, ma non impedisce il riavvio al successivo riavvio del computer. Per interrompere l'avvio del servizio all'avvio, deve disattivare Quello:

sudo systemctl disabilita htg.service

Se il servizio è in esecuzione, questo comando non lo ferma. dì solo systemd per non avviare il servizio al prossimo riavvio.

Se vuoi interrompere il servizio e impedirne l'avvio durante l'avvio, usa entrambi i comandi.

Consiglio di servizio

Assicurati che il tuo programma funzioni come previsto prima di provare a eseguirlo come servizio.

Iscriviti alla nostra Newsletter

Non ti invieremo posta SPAM. Lo odiamo quanto te.