Come eseguire un programma Linux all'avvio con systemd
Pubblicato: 2022-01-29Hai 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 persystemd
- 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
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.
La sceneggiatura non fa molto, ma ci sono alcuni punti degni di nota.
- Le due linee di
echo
vengono convogliate tramitesystemd-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.
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.
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 daExecStart
è 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 asystemctl
di interrompere il servizio. Abbiamo questo set per "elaborare". Ciò fa sì chesystemd
utilizzi il segnaleSIGTERM
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
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.
- 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 comandosleep
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
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.
Comandi Linux | ||
File | tar · pv · cat · tac · chmod · grep · diff · sed · ar · man · pushd · popd · fsck · testdisk · seq · fd · pandoc · cd · $PATH · awk · join · jq · fold · uniq · journalctl · tail · stat · ls · fstab · echo · less · chgrp · chown · rev · look · strings · type · rename · zip · unzip · mount · umount · install · fdisk · mkfs · rm · rmdir · rsync · df · gpg · vi · nano · mkdir · du · ln · patch · converti · rclone · shred · srm | |
Processi | alias · screen · top · nice · renice · progress · strace · systemd · tmux · chsh · history · at · batch · free · which · dmesg · chfn · usermod · ps · chroot · xargs · tty · pinky · lsof · vmstat · timeout · wall · yes · kill · sleep · sudo · su · time · groupadd · usermod · groups · lshw · shutdown · reboot · halt · poweroff · passwd · lscpu · crontab · date · bg · fg | |
Rete | netstat · ping · traceroute · ip · ss · whois · fail2ban · bmon · dig · finger · nmap · ftp · curl · wget · who · whoami · w · iptables · ssh-keygen · ufw |
CORRELATI: I migliori laptop Linux per sviluppatori e appassionati