
Table des matières
SystemD est un système d'initial puissant et très polyvalent pour les distros Linux. Il peut exécuter des programmes, gérer les ressources système et même contrôler l'état de votre ordinateur. Dans cet article, je vais montrer comment vous pouvez utiliser SystemD pour contrôler vos applications en créant une unité de service personnalisée à Ubuntu.
Qu'est-ce qu'une unité de service Systemd?
Une unité de service est un fichier régulier qui contient des détails sur la façon d'exécuter une application spécifique. Il comprend les métadonnées générales du programme, comment l'exécuter et si SystemD peut y accéder lors d'une session ordinaire.
Par défaut, chaque démon sur une machine basée sur Systemd a une forme de fichier de service. OpenSSH, par exemple, utilise l'unité SSH.Service dans «/ etc / systemd / system /» pour déterminer comment elle fonctionnera dans Debian et Ubuntu.
À un niveau de base, un fichier d'unité de service est composé de trois parties: l'unité, le service et les catégories d'installation. Le Unit
La section fournit les métadonnées et les dépendances de l'application. Le Service
La section définit où se trouve l'application et comment Systemd l'exécutera. Enfin, le Install
La section décrit quand peut démarrer l'application.
Création d'un service SystemD personnalisé au niveau du système
L'une des utilisations les plus courantes pour un service personnalisé est l'automatisation des commandes qui nécessitent des privilèges racine ou profitent des minuteries SystemD. Par exemple, un service personnalisé aide à garantir qu'un serveur Minecraft démarre correctement après un redémarrage.
Pour créer un service de niveau système personnalisé dans Linux, commencez par fabriquer le fichier unitaire Systemd dans le répertoire personnel de votre utilisateur:
nano ~/my-system-app.service
Collez le bloc de code suivant dans votre nouveau fichier unitaire. Il s'agit de la configuration valide la plus simple pour un service SystemD:
(Unit) Description=My First Service After=network.target (Service) Type=simple ExecStart=/path/to/bin Restart=always (Install) WantedBy=multi-user.target
Remplacez la variable «Description» par les détails de votre service de niveau utilisateur.
Remplacez la variable «EXECSTART» par le chemin de fichier complet du programme que vous souhaitez exécuter.

Enregistrez votre nouveau fichier, puis copiez-le dans le répertoire des services de votre machine:
sudo cp ./my-system-app.service /etc/systemd/system/
Exécutez la commande suivante pour redémarrer le démon systemd:
sudo systemctl daemon-reload
Testez votre nouveau service au niveau du système en exécutant la commande suivante:
sudo systemctl start my-system-app.service
Enfin, confirmez que votre nouveau service s'exécute correctement en vérifiant son statut dans SystemCTL:
systemctl status my-system-app.service

Création d'un service SystemD personnalisé au niveau de l'utilisateur
Les unités de service ne sont pas limitées aux applications ou aux superutilisateurs au niveau du système. À l'aide de SystemD-User, il est possible de créer des services sans racine. Cela permet aux utilisateurs non racinaires de gérer les applications locales tout en améliorant la sécurité de leur PC en limitant les programmes avec un accès racine.
Pour créer votre service personnalisé au niveau de l'utilisateur dans Linux, créez un nouveau fichier unitaire Systemd dans le répertoire personnel de votre utilisateur:
nano ~/my-user-app.service
Collez le bloc de code suivant dans votre nouveau fichier unitaire:
(Unit) Description=My First User Service After=graphical-session.target (Service) Type=simple ExecStart=/path/to/bin (Install) WantedBy=default.target
Remplacez la valeur de la variable «EXECSTART» au chemin du programme que vous souhaitez exécuter. Comme il s'agit d'un service de niveau utilisateur, assurez-vous que votre compte d'utilisateur a un accès approprié au binaire.

Enregistrez votre nouveau fichier de service au niveau de l'utilisateur, puis créez le répertoire SystemD local pour votre utilisateur:
mkdir -p ~/.config/systemd/user/
Copiez votre nouveau fichier de service au niveau de l'utilisateur dans le répertoire SystemD local pour votre utilisateur:
cp ./my-user-app.service ~/.config/systemd/user/
Assurez-vous que SystemD vérifie votre répertoire utilisateur pour les nouveaux fichiers d'unité de service:
systemctl daemon-reload --user
Enfin, confirmez que votre nouveau service s'exécute correctement en vérifiant son statut dans SystemCTL:
systemctl --user status my-user-app.service

Peaufiner votre service Systemd personnalisé
L'une des principales forces de SystemD est qu'elle vous permet de personnaliser pleinement la façon d'exécuter et de gérer les programmes.
Ajout de variables d'environnement à un service personnalisé
Les variables d'environnement sont une partie importante de chaque système Linux. Ils fournissent des données supplémentaires à un programme sans jouer avec des fichiers de configuration. Avec SystemD, il est possible d'utiliser des variables d'environnement en l'intégrant à vos unités de service.
Commencez par désactiver le service que vous souhaitez modifier:
systemctl --user disable --now my-user-app.service
Ouvrez votre fichier de service personnalisé à l'aide de votre éditeur de texte préféré:
sudo nano ~/.config/systemd/user/my-user-app.service
Faites défiler vers la section «(Service)», puis ajoutez la ligne de code suivante juste en dessous de la variable «type =»:
Environment=""
Ajoutez la variable d'environnement que vous souhaitez ajouter à votre service personnalisé. Dans mon cas, je souhaite ajouter une variable d'éditeur pour m'assurer que mon service voit mon instance VIM.

Enregistrez votre fichier de service modifié, puis rechargez votre démon Systemd pour appliquer vos modifications.

Redémarrez votre nouveau service Systemd pour utiliser votre nouvelle variable d'environnement:
systemd --user start my-user-app.service
Restreindre le service personnalisé à un utilisateur spécifique
Outre les fichiers unitaires au niveau de l'utilisateur, vous pouvez également modifier un service au niveau du système pour s'exécuter sous un utilisateur spécifique. Ceci est utile si vous souhaitez exécuter une application sous un compte utilisateur sans racine et sans shell.
Pour lier un service SystemD à un utilisateur, désactivez d'abord complètement votre unité personnalisée.

Assurez-vous que le compte d'utilisateur cible existe déjà sur votre machine.

Ouvrez votre fichier de service au niveau du système à l'aide de votre éditeur de texte préféré:
sudo nano /etc/systemd/system/my-system-app.service
Faites défiler vers le bas vers la section «(Service)», puis ajoutez la variable «user =» suivie du nom de votre compte utilisateur.

Note: Vous pouvez également spécifier le groupe pour votre service en ajoutant «Group =» sous la variable utilisateur.
Enregistrez les modifications sur votre fichier unitaire, puis redémarrez le service:
sudo systemctl start my-system-app.service
Confirmez que votre service s'exécute désormais en tant qu'utilisateur en exécutant la commande suivante:
ps -o user= -p $(systemctl show my-system-app.service -p MainPID | awk -F= '{print $2}')

Limiter la consommation de ressources d'une unité de service
En plus de modifier les variables et les utilisateurs d'environnement, Systemd peut limiter les ressources qu'une application peut consommer au cours de sa durée de vie. Bien qu'il ne le fasse pas par défaut, il est possible de contrôler les pièces de base telles que l'utilisation du processeur et le nombre global de processus.
Commencez par désactiver complètement le service que vous souhaitez modifier.

Ouvrez le fichier de l'unité de service à l'aide de votre éditeur de texte préféré:
sudo nano /etc/systemd/system/my-system-app.service
Faites défiler jusqu'à la section «(Service)», puis ajoutez le nom de variable pour la ressource que vous souhaitez limiter. Par exemple, l'ajout de la variable «MemoryHigh =» vous permet de définir une limite de mémoire douce pour ce service.

Enregistrez votre fichier unitaire, puis rechargez votre service Systemd:
sudo systemctl enable --now my-system-app.service
Enfin, vous pouvez surveiller vos services en cours d'exécution en exécutant systemd-cgtop
.

Apprendre à créer des services SystemD personnalisés et à les modifier à vos besoins est simplement la mesure de la compréhension de cet outil très polyvalent. Explorez plus de Systemd et ce que son écosystème complet peut faire en vérifiant comment Run0 fonctionne contre Sudo.