Recherche de site Web

Comment créer et exécuter de nouvelles unités de service dans Systemd


Il y a quelques jours, je suis tombé sur une distribution Centos 8 32 bits et j'ai ressenti l'envie de la tester sur une vieille machine 32 bits. Après le démarrage, j'ai réalisé qu'il y avait un bug et qu'il perdait la connexion réseau, que je devais activer manuellement à chaque fois après le démarrage. La question était donc de savoir comment définir un script effectuant ce travail, s'exécutant à chaque démarrage de ma machine ?

Eh bien, c'est très simple et je vais vous montrer le fonctionnement du système en utilisant des unités de service. Mais d’abord une petite introduction aux unités de service.

Dans cet article, je vais expliquer ce qu'est une « unité de service » dans systemd et à quel point il est facile d'en créer et d'en exécuter une. Je vais essayer de simplifier ce que sont les « cibles », pourquoi nous les appelons « collections d'unités » et quels sont leurs « désirs ». Enfin, nous profitons d'une unité de service pour exécuter notre propre script après la procédure de démarrage.

Il est évident que votre ordinateur est utile en raison des services qu’il offre et pour avoir cette fonctionnalité, de nombreux services doivent être appelés au démarrage de l’ordinateur et atteignent différents niveaux.

D'autres services sont appelés pour être exécutés lorsque l'ordinateur atteint, par exemple, le niveau de secours (niveau d'exécution 0) et d'autres lorsqu'il atteint le niveau multi-utilisateurs (niveau d'exécution 3). . Vous pouvez imaginer ces niveaux comme des cibles.

De manière simple, target est un ensemble d'unités de service. Si vous souhaitez consulter les unités de service exécutées dans votre niveau graphical.target, tapez :

systemctl --type=service

Comme vous pouvez le constater, certains services sont actifs et "en cours d'exécution" tout le temps, tandis que d'autres ne s'exécutent qu'une seule fois et se terminent (quittés).

Si vous souhaitez vérifier l'état d'un service, vous pouvez utiliser la commande systemctl comme indiqué.

systemctl status firewalld.service

Comme vous pouvez le voir, j'ai vérifié l'état de firewalld.service (astuce : vous pouvez utiliser la saisie semi-automatique pour le nom du service ). Il m'informe que le service firewalld est en cours d'exécution tout le temps et qu'il est activé.

Activé et désactivé signifient que le service sera chargé en permanence ou non, respectivement lors du prochain démarrage. En revanche, démarrer et arrêter un service a la limitation de la session en cours et n’est pas permanent.

Par exemple, si vous tapez :

systemctl stop firewalld.service
systemctl status firewalld.service

Vous pouvez voir que le firewalld.service est inactif (mort) mais il est toujours activé, ce qui signifie qu'au prochain démarrage il sera chargé. Donc, si nous voulons qu'un service soit chargé lors du démarrage à l'avenir, nous devons l'activer. Quelle belle conclusion ! Créons-en un, c'est facile.

Si vous allez dans le dossier :

cd /etc/systemd/system
ls -l

Vous pouvez voir quelques fichiers liens de services unitaires et quelques répertoires des « envies » d'une cible. Par exemple, ce que la cible multi-utilisateur souhaite charger lorsque la procédure de démarrage atteint son niveau est répertorié dans le répertoire portant le nom /etc/systemd/system/multi-user.target.wants/ .

ls multi-user.target.wants/

Comme vous pouvez le constater, il ne contient pas seulement des services mais également d'autres cibles qui sont également des collections de services.

Créons une unité de service avec le nom connection.service.

vim connection.service

et tapez ce qui suit (appuyez sur « i » pour le mode insertion), enregistrez-le et quittez (avec « esc » et « :wq ! » ) :

[Unit]
Description = making network connection up
After = network.target

[Service]
ExecStart = /root/scripts/conup.sh

[Install]
WantedBy = multi-user.target

Pour expliquer ce qui précède : nous avons créé une unité de type service (vous pouvez également créer des unités de type cible), et nous l'avons configurée pour qu'elle soit chargée après le network.target (vous pouvez comprendre que le la procédure de démarrage atteint les cibles avec un ordre défini) et nous voulons qu'à chaque fois que le service démarre, il exécute un script bash portant le nom conup.sh que nous allons créer.

Le plaisir commence avec la dernière partie [install]. Il indique qu'il sera recherché par « multi-user.target ». Donc, si nous activons notre service, un lien symbolique vers ce service sera créé dans le dossier multi-user.target.wants ! J'ai compris? Et si nous le désactivons, ce lien sera supprimé. Si simple.

Activez-le simplement et vérifiez :

systemctl enable connection.service

Il nous informe que le lien symbolique dans le dossier multi-user.target.wants a été créé. Vous pouvez confirmer en exécutant la commande ls comme indiqué.

ls multi-user.target.wants/

Comme vous pouvez le voir, « connection.service » est prêt pour le prochain démarrage, mais nous devons d'abord créer le fichier script.

cd /root
mkdir scripts
cd scripts
vim conup.sh

Ajoutez la ligne suivante dans Vim et enregistrez-la :

#!/bin/bash
nmcli connection up enp0s3

La commande nmcli pour afficher la connexion réseau pour l'interface enp0s3.

Bien sûr, si vous souhaitez que votre script exécute autre chose, vous pouvez taper ce que vous voulez au lieu de la deuxième ligne.

Par exemple,

#!/bin/bash
touch /tmp/testbootfile

cela créerait un fichier dans le dossier /tmp (juste pour vérifier que votre service fonctionne).

Nous devons également rendre le script exécutable en exécutant la commande chmod comme indiqué.

chmod +x conup.sh

Maintenant, nous sommes prêts. Si vous ne voulez pas attendre le prochain démarrage (il est déjà activé), nous pouvons démarrer le service pour la session en cours en tapant :

systemctl start connection.service

Voilà ! Ma connexion est opérationnelle !

Si vous avez choisi d'écrire la commande « touch /tmp/testbootfile » dans le script, juste pour vérifier sa fonctionnalité, vous verrez ce fichier créé dans le dossier /tmp .

J'espère vraiment vous aider à comprendre en quoi consistent les services, les souhaits, les cibles et l'exécution de scripts pendant le démarrage.