systemd

fichier unité systemd création d'un service

fichier unité systemd création d'un service
La gestion des services est une chose à laquelle vous ne pensez même pas lorsque vous utilisez votre poste de travail Linux ou votre serveur Linux tous les jours, mais quand elle n'est pas là, vous la détesterez vraiment. Lorsque vous créez par exemple un nouveau programme serveur qui doit fonctionner 24h/24 et 7j/7, relever ce défi sans gestion de service est un cauchemar où vous créez en fait un petit système de service vous-même, qui ne sera évidemment pas aussi bon que le gestionnaire développé équipe complète pendant des années, en tout cas.

Avec ses services, systemd rend tout cela plus facile, vraiment plus facile. Dès que vous voulez quelque chose pour surveiller votre application et la contrôler facilement, systemd est la voie à suivre, et c'est ce que je vais expliquer ici!

Où sont les services Systemd

Pour ajouter un nouveau service, eh bien, vous devez répondre à cette question. Comme toujours dans systemd, cela dépend si le service est uniquement destiné à votre utilisateur ou à l'ensemble du système. Nous nous concentrerons sur le fonctionnement de systemd pour l'ensemble des services système.

L'emplacement exact dépend de pourquoi et comment le service a été installé. Si le service est installé par un gestionnaire de paquets, il sera généralement dans /usr/lib/systemd/system. Pour les logiciels que vous développez ou ceux qui ne prennent pas en charge systemd par lui-même, vous placerez le fichier de service dans /usr/local/lib/systemd/system. Veuillez garder à l'esprit que certaines distributions ne prennent pas en charge ce dossier dans /usr/local. Enfin, si vous souhaitez configurer un service systemd existant, /etc/systemd/system est la solution.

Dans ces dossiers, vous pouvez trouver plusieurs extensions de fichiers telles que *.prise, *.cible ou *.un service. Évidemment, nous allons nous concentrer sur le dernier. systemd utilise le nom de fichier comme nom du service lors de son démarrage ou de son arrêt, etc. Donc, généralement, les noms de fichiers en service ne contiennent que des caractères alphanumériques avec des tirets et des traits de soulignement. Pendant le développement, je vous recommande de le créer dans vos documents, puis de le copier dans l'emplacement systemd une fois terminé, cela vous éviterait des problèmes si vous enregistrez au milieu de l'édition.

OK alors merci de créer votre dossier de service dans vos documents. Nous sommes maintenant prêts à revoir comment écrire ce fichier.
[Remarque : voir le rapport de bogue potentiel dans la section des commentaires de cet article de blog]

[Unité]
Description=Serveur HTTP d'application Web Penguins (s'exécutant sur le port 8080)
WantedBy=multi-utilisateur.cible
 
[Un service]
Type=simple
ExecStart=/usr/bin/python3 /usr/local/bin/penguin-web-app/main.py
Redémarrer=toujours

Le format de fichier est en fait proche de ini. Je sais que cela peut être étrange étant donné que les fichiers ini sont souvent trouvés dans Windows mais c'est comme ça que ça marche. Le fichier de service est d'abord divisé en 2 sections : [Unité] et [Service]. Chaque section configure un aspect spécifique de systemd : [Unit] contient des éléments partagés par tous les fichiers d'unité de systemd tandis que [Service] est uniquement destiné à la configuration spécifique à la mise en place d'un nouveau service.

Ensuite, la section est configurée avec des propriétés telles que Description= ou ExecStart=. La valeur est séparée du nom de la propriété par le signe égal = sans espace.

Revenons au fichier ci-dessus. Il décrit un service conçu pour exécuter une application Web écrite en Python sur les pingouins. systemd le redémarrera chaque fois que le processus se terminera et démarrera le serveur au démarrage du serveur si vous l'activez avec la commande systemctl enable. Cool hein?

Mais vous êtes peut-être que votre prochaine application Web ne concerne pas les pingouins - et c'est dommage - et ce n'est pas écrit en Python. Dans ce cas, vous voudrez en savoir plus sur les configurations possibles.

Propriétés des services Systemd

Concentrons-nous d'abord sur les propriétés de [Unit] :

Description= consiste simplement à donner une description claire de ce que fait le service. Il est affiché dans la liste des services, les journaux de service, vous voulez donc qu'il soit descriptif, mais il doit rester sur une ligne et une phrase.

WantedBy= permet de dire à systemd : quand cette chose est démarrée, me démarre aussi. Généralement vous mettrez le nom d'une cible. Exemples de cibles communes :

  1. multi-utilisateur.cible : lorsque le serveur est OK et est prêt à exécuter des applications en ligne de commande
  2. graphique.cible : lorsque GNOME ou KDE est prêt
  3. mise en réseau.cible : lorsque le serveur est correctement connecté à un réseau

OK pour le début ces propriétés de [Unit] suffisent. Jetons un coup d'œil sur [Service] maintenant.

Type= aide systemd à savoir si un service est en cours d'exécution. Voici les types courants :

  1. simple est probablement le plus couramment utilisé : systemd considère le processus que vous lancez comme celui qui effectue le service. Si le processus s'arrête, il considère que le service s'est également arrêté, etc.
  2. le forking est préféré pour les applications qui ont été écrites pour être un serveur mais sans l'aide d'un système de gestion de services. Fondamentalement, il s'attend à ce que le processus lancé bifurque et que fork soit considéré comme le processus final pour le service. Afin d'être plus précis, vous pouvez également aider systemd avec un fichier PID, où le PID du processus à suivre est écrit par l'application lancée.

ExecStart= est probablement le plus important pour un service : il précise quelle application lancer au démarrage du service. Comme vous pouvez le voir dans le service Penguin, j'ai utilisé /usr/bin/python3 et non python3 tout de suite. C'est parce que la documentation systemd recommande explicitement d'utiliser des chemins absolus afin d'éviter toute surprise.

Mais c'est aussi pour une autre raison. Le système de gestion d'autres services a tendance à être basé sur des scripts Shell. Cependant systemd, pour des raisons de performances, n'exécute pas de shell par défaut. Vous ne pouvez donc pas fournir directement une commande shell dans ExecStart=. Vous pouvez cependant toujours utiliser un script shell en faisant :

ExecStart=/usr/bin/bash /usr/local/bin/launch-penguin-server.sh

Pas si difficile à droite? Notez que si vous devez exécuter un processus pour signaler à votre service de s'arrêter proprement, ExecStop= existe, ainsi que ExecReload= pour recharger les services.

Restart= vous permet de dire explicitement quand le service doit être redémarré. C'est l'une des fonctionnalités importantes de systemd : elle garantit que votre service reste actif aussi longtemps que vous le souhaitez, alors faites très attention à cette option.

Redémarrer= Sens
toujours systemd continuera à le redémarrer chaque fois qu'il se terminera ou se bloquera. Eh bien, jusqu'à ce que vous fassiez systemctl stop service-name.un service.

C'est parfait pour les serveurs et les services en ligne car vous préférez peu de redémarrages inutiles plutôt que d'avoir à redémarrer manuellement le service sans aucune raison.

sur-anormal Lorsque le processus de service se bloque, redémarrez le service. Cependant, si l'application se ferme correctement, ne la redémarrez pas.

C'est plus utile pour les tâches cron comme les services qui doivent effectuer une tâche de manière fiable mais n'ont pas besoin de s'exécuter tout le temps.

en cas d'échec Tout comme on-anormal, mais il redémarre également le service lorsque l'application se ferme proprement mais avec un code de sortie différent de zéro. Des codes de sortie différents de zéro signifient généralement qu'une erreur s'est produite.
non systemd ne redémarrera pas le service automatiquement.

Généralement utile pour accéder à d'autres fonctionnalités de systemd telles que la journalisation sans la fonction de redémarrage.

WorkingDirectory= peut imposer un répertoire de travail lors du lancement de votre application. La valeur doit être un chemin de répertoire absolu. Le répertoire de travail est utilisé lorsque vous utilisez des chemins relatifs dans le code de votre application. Pour notre service de pingouins, cela pourrait être :

WorkingDirectory=/srv/penguin-web-app/

Ensuite, la sécurité est importante donc vous ne voulez généralement pas lancer votre service avec les privilèges root. User= et Group= vous permet de définir le nom d'utilisateur ou de groupe ou l'UID/GID sous lequel votre application sera lancée. Par example:

Utilisateur=pingouin-web
Groupe=pingouin-web

EnvironmentFile= est une option puissante. Les applications exécutées en tant que services ont souvent besoin de fichiers de configuration et d'environnement permettent de définir cette configuration de deux manières :

  1. L'application peut lire directement la variable d'environnement.
  2. Mais vous pouvez également définir différents arguments de ligne de commande pour votre application sans modifier le fichier de service.

La syntaxe de ce fichier est simple : vous tapez le nom de la variable d'environnement, le signe égal = puis sa valeur. Ensuite, vous mettez le chemin absolu de votre fichier d'environnement dans la propriété EnvironmentFile.

Donc exemple :

EnvironmentFile=/etc/penguin-web-app/environment

Et le fichier /etc/penguin-web-app/environment contient :

ÉCOUTEZ_PORT=8080

Ensuite, notre application Web Penguins aura accès à la variable d'environnement LISTEN_PORT et écoutera le port attendu.

Enregistrez et démarrez le service Systemd nouvellement créé

Donc si vous avez suivi mes conseils, vous avez édité votre fichier de service dans votre répertoire personnel. Une fois que vous êtes satisfait, copiez ce fichier dans /usr/local/lib/systemd/system, en supposant que votre distribution prend en charge ce chemin. Le nom de fichier de votre fichier de service sera son nom de service. Ce nom de fichier doit se terminer par .un service. Par exemple, pour notre serveur penguins, ce serait penguin-web-app.un service.

Ensuite, vous devez dire à systemd que vous avez ajouté un nouveau service, vous devez donc taper cette commande :

$ sudo systemctl démon-recharger

Bon maintenant systemd est au courant de votre nouveau service, en supposant que votre fichier ne contienne pas d'erreur de syntaxe. Après tout, c'est votre premier fichier, il est donc probable que vous fassiez des erreurs. Vous devez exécuter cette commande ci-dessus à chaque mise à jour de votre fichier de service.

Maintenant, il est temps de démarrer le service :

$ sudo systemctl démarrer penguin-web-app.un service

S'il échoue avec une erreur Unité non trouvée comme celle-ci :

$ sudo systemctl démarrer penguin-web-app.un service
Échec du démarrage de l'application web penguin.service : unité introuvable.

Cela signifie que votre distribution ne prend pas en charge le répertoire ou que vous n'avez pas nommé correctement votre fichier de service. Assurez-vous de vérifier.

Si vous configurez votre service avec WantedBy= et que vous souhaitez que votre service démarre automatiquement, vous devez l'activer, avec cette commande :

$ sudo systemctl activer penguin-web-app.un service

Ce qui est cool avec un service, c'est qu'il s'exécute en arrière-plan. Le problème : comment savoir s'il fonctionne correctement et s'il s'exécute s'il s'exécute en arrière-plan? Ne vous inquiétez pas, l'équipe systemd a pensé à cela aussi et a fourni une commande pour voir si cela fonctionne correctement, depuis combien de temps, etc :

$ systemctl status penguin-web-app.un service

Conclusion

félicitations! Vous pouvez désormais faire gérer vos applications sans vous soucier de les redémarrer manuellement à chaque fois. Maintenant, je vous recommande de lire notre autre article sur les logs systemd : Master journalctl : comprendre les logs systemd. Avec cela, vous pouvez utiliser le puissant système de journalisation sur votre nouveau service et créer des serveurs plus fiables!

Meilleures applications de mappage de manette de jeu pour Linux
Si vous aimez jouer à des jeux sur Linux avec une manette de jeu au lieu d'un système de saisie clavier et souris typique, il existe des applications ...
Outils utiles pour les joueurs Linux
Si vous aimez jouer à des jeux sur Linux, il est probable que vous ayez utilisé des applications et des utilitaires comme Wine, Lutris et OBS Studio p...
Jeux HD remasterisés pour Linux qui n'ont jamais eu de version Linux plus tôt
De nombreux développeurs et éditeurs de jeux proposent une remasterisation HD d'anciens jeux pour prolonger la durée de vie de la franchise, veuillez ...