Comment exécuter un programme Linux au démarrage avec systemd
Publié: 2022-01-29Besoin de lancer un programme Linux au démarrage ? Le logiciel systemd fournit un moyen de le faire sur n'importe quelle distribution Linux avec systemd, ce qui est la plupart d'entre eux de nos jours, y compris Ubuntu. Nous vous guiderons tout au long du processus de création d'un service intégré, et il parlera même au journal.
Ce didacticiel montre comment configurer un service système qui se lance lorsque vous démarrez votre système. Pour lancer un programme graphique lorsque vous vous connectez, utilisez plutôt le gestionnaire de démarrage de votre bureau.
Exécuter des programmes au démarrage
Parfois, le logiciel que vous installez sur votre ordinateur s'accroche au processus de démarrage de Linux, de sorte que le programme est automatiquement lancé à chaque démarrage de l'ordinateur. Vous pouvez facilement obtenir ce même comportement avec vos propres programmes et scripts, ou en fait avec tout autre programme installé sur votre ordinateur.
Les programmes lancés au démarrage sont contrôlés par systemd
, le gestionnaire de système et de service. systemd
est le premier processus à s'exécuter au démarrage. Il a toujours l'ID de processus (PID) 1. Tous les autres processus en cours d'exécution sur votre ordinateur sont démarrés par systemd
ou par un processus que systemd
a déjà démarré.
Les programmes qui s'exécutent en arrière-plan sont appelés démons ou services. Le "d" à la fin de systemd
signifie démon. Dans cet article, nous allons créer un exemple de service. Pour cocher toutes les cases, notre service doit être :
- Intégré à
systemd
via un fichier d'unité de service - Lancé au démarrage
- Contrôlable à l'aide
systemctl
, l'interface de contrôle desystemd
- Capable d'écrire au journal
Création du programme de service
Nous avons besoin d'un programme que systemd
lancera. Nous allons créer un script simple, appelé « htg.sh ». Ce didacticiel utilise l'éditeur de texte Gedit, mais vous pouvez utiliser l'éditeur de texte de votre choix.
toucher htg.sh
gedit htg.sh
L'éditeur gedit
s'ouvrira. Copiez et collez le texte suivant dans l'éditeur.
#!/bin/bash echo "htg.service : ## Démarrage ##" | systemd-cat -p infos tandis que : faire HORODATAGE=$(date '+%Y-%m-%d %H:%M:%S') echo "htg.service : horodatage ${TIMESTAMP}" | systemd-cat -p infos dormir 60 Fini
Enregistrez vos modifications et fermez l'éditeur.
Le script ne fait pas grand-chose, mais il y a quelques points à noter.
- Les deux lignes
echo
sont acheminées viasystemd-cat
, un programme qui prend la sortie d'un programme et l'envoie au journal. Les entrées au journal sont prioritaires. Nous utilisons l'option-p
(priorité) pour indiquer que nos messages sont à titre informatif (info) uniquement. Ce ne sont pas des erreurs ou des avertissements importants. - Il y a une boucle
while
sans fin. - La variable
TIMESTAMP
est définie sur la date et l'heure actuelles. Ceci est formaté dans un message et envoyé au journal. - Le script dort ensuite pendant 60 secondes.
- Après 60 secondes, la boucle est répétée. Ainsi, ce script écrit un message horodaté dans le journal une fois par minute.
Nous allons copier le script dans le /usr/local/bin
.
sudo cp htg.sh /usr/local/bin
Et nous devons le rendre exécutable:
sudo chmod +x /usr/local/bin/htg.sh
Création du fichier d'unité de service
Chaque programme démarré par systemd
possède un fichier de définition, appelé fichier d'unité de service. Cela contient certains attributs que systemd
peut utiliser pour localiser et lancer le programme, et pour définir certains de ses comportements.
Nous devons créer un fichier d'unité pour notre nouveau service, mais il est prudent de s'assurer qu'aucun des fichiers d'unité existants ne porte le nom que nous voulons donner à notre nouveau service.
sudo systemctl list-unit-files --type-service
Vous pouvez faire défiler la liste des fichiers de l'unité, qui est triée par ordre alphabétique, et vérifier que le nom que vous souhaitez utiliser n'est pas pris.
Notre service va s'appeler "htg.service". Aucun fichier d'unité n'a ce nom, nous pouvons donc continuer et créer notre fichier d'unité.
sudo gedit /etc/systemd/system/htg.service
L'éditeur gedit
s'ouvrira. Copiez et collez le texte suivant dans l'éditeur :
[Unité] Description=Exemple de service Geek pratique Veut=réseau.cible Après=syslog.target network-online.target [Un service] Genre=simple ExecStart=/usr/local/bin/htg.sh Redémarrer = en cas d'échec RestartSec=10 KillMode=processus [Installer] WantedBy=multi-utilisateur.cible
Enregistrez vos modifications et fermez l'éditeur.
Les entrées ont ces significations. Ce sont des entrées typiques. Notre service simple n'a pas réellement besoin de la plupart d'entre eux, mais les inclure nous permet de les expliquer.
- Description : Il s'agit d'une description textuelle de votre service.
- Veut : notre service souhaite, mais n'exige pas, que le réseau soit opérationnel avant le démarrage de notre service.
- Après : une liste des noms d'unités qui doivent être lancées après le démarrage réussi de ce service, si elles ne sont pas déjà en cours d'exécution.
- Genre : Simple.
systemd
considérera ce service comme démarré dès que le processus spécifié parExecStart
aura été forké. - ExecStart : le chemin d'accès au processus qui doit être démarré.
- Redémarrer : quand et si le service doit être redémarré. Nous l'avons défini sur "en cas d'échec".
- RestartSec : durée d'attente avant de tenter de redémarrer le service. Cette valeur est en secondes.
- KillMode : Définit comment
systemd
doit tuer le processus si nous demandons àsystemctl
d'arrêter le service. Nous avons cet ensemble pour "traiter". Cela obligesystemd
à utiliser le signalSIGTERM
uniquement sur le processus principal. Si notre service était un programme non trivial au lieu d'un simple script, nous le définirions sur "mixte" pour garantir que tous les processus engendrés soient également terminés. - WantedBy : Nous avons défini ce paramètre sur "multi-user.target", ce qui signifie que le service doit être démarré tant que le système est dans un état où plusieurs utilisateurs peuvent se connecter, qu'une interface utilisateur graphique soit disponible ou non.
Le fichier d'unité n'a pas besoin d'être exécutable, mais les autorisations sur le fichier d'unité doivent restreindre qui peut le modifier. Vous ne voulez pas qu'un utilisateur malveillant ou espiègle modifie le fichier d'unité afin qu'il exécute un programme complètement différent.
Cette commande donnera au propriétaire des autorisations de lecture et d'écriture et des autorisations de lecture au groupe. D'autres n'auront aucune autorisation.
sudo chmod 640 /etc/systemd/system/htg.service
Nous pouvons demander à systemctl
de vérifier la syntaxe de notre fichier d'unité pour nous, même si le service n'est pas encore en cours d'exécution. Toute erreur sera signalée. (En fait, la partie ".service" est facultative pour la plupart des commandes.)
systemctl statut htg.service
Aucune erreur n'est mise en évidence, ce qui signifie que notre fichier d'unité est syntaxiquement correct.
Démarrage du service
Lorsque vous ajoutez un nouveau fichier d'unité ou modifiez un fichier existant, vous devez indiquer à systemd
de recharger les définitions de fichier d'unité.
rechargement du démon systemctl sudo
Si vous voulez qu'un service soit lancé au démarrage vous devez l' activer :
sudo systemctl activer htg
L'activation d'un service ne le démarre pas, cela le configure uniquement pour qu'il soit lancé au démarrage. Pour démarrer le service maintenant , vous devez utiliser systemctl
avec l'option de start
.
sudo systemctl démarrer htg
Vérification du service
Après avoir démarré manuellement le service ou après avoir redémarré l'ordinateur, nous pouvons vérifier que notre service fonctionne correctement.
sudo systemctl status htg.service
L'état du service nous est affiché.
- Le point vert signifie que notre service fonctionne correctement.
- Le nom du service est « htg.service », et la description longue est celle que nous avons fournie dans le fichier unité.
- On nous montre quel fichier d'unité a été chargé "/etc/systemd/system/htg.service".
- Le service est actif et l'heure à laquelle le service a été lancé nous est indiquée.
- Son PID est 7762.
- Deux tâches sont associées au service.
- Un total de 928 kibioctets de mémoire sont utilisés par le service.
- Le groupe de contrôle comprend le script "htg.sh" et la commande
sleep
, qui a été lancée par "htg.sh". La plupart du temps, la commandesleep
fera le travail pour ce service.
Nous affichons également les 10 dernières entrées de journal produites par ce service. Sans surprise, ils sont tous à une minute d'intervalle.
Arrêt et désactivation du service
Si vous devez arrêter le service, vous pouvez le faire avec cette commande :
sudo systemctl stop htg.service
Cela arrête le service, mais cela ne l'empêche pas de redémarrer au prochain redémarrage de l'ordinateur. Pour arrêter le lancement du service au démarrage, vous devez le désactiver :
sudo systemctl désactiver htg.service
Si le service est en cours d'exécution, cette commande ne l'arrête pas. Il dit simplement à systemd
de ne pas lancer le service au prochain redémarrage.
Si vous souhaitez arrêter le service et l'empêcher de se lancer au démarrage, utilisez les deux commandes.
Conseil d'entretien
Assurez-vous que votre programme s'exécute comme prévu avant d'essayer de le lancer en tant que service.
Commandes Linux | ||
Des dossiers | tar · pv · chat · tac · chmod · grep · diff · sed · ar · man · pushd · popd · fsck · testdisk · seq · fd · pandoc · cd · $PATH · awk · join · jq · plier · uniq · journalctl · queue · stat · ls · fstab · echo · moins · chgrp · chown · rev · regarder · chaînes · type · renommer · zip · décompresser · monter · umount · installer · fdisk · mkfs · rm · rmdir · rsync · df · gpg · vi · nano · mkdir · du · ln · patch · convertir · rclone · déchiqueter · srm | |
Processus | alias · écran · top · sympa · renice · progrès · strace · systemd · tmux · chsh · historique · at · batch · gratuit · lequel · dmesg · chfn · usermod · ps · chroot · xargs · tty · pinky · lsof · vmstat · timeout · mur · oui · kill · sleep · sudo · su · time · groupadd · usermod · groupes · lshw · shutdown · reboot · halt · poweroff · passwd · lscpu · crontab · date · bg · fg | |
La mise en réseau | netstat · ping · traceroute · ip · ss · whois · fail2ban · bmon · creuser · doigt · nmap · ftp · curl · wget · qui · whoami · w · iptables · ssh-keygen · ufw |
CONNEXION: Meilleurs ordinateurs portables Linux pour les développeurs et les passionnés