Comment ajouter vos propres services à systemd pour une gestion plus facile
Les serveurs Linux sont conçus pour être exécutés en permanence; plutôt que de lancer des programmes importants manuellement et de les laisser dans un tmux
session, vous devez les ajouter à systemd
en tant que service qui démarrera automatiquement au démarrage et redémarrera si des erreurs surviennent.
Travailler avec Systemd et les services
Systemd stocke la configuration des services à deux endroits. Le premier est /lib/systemd/system/
, où vous trouverez la configuration de nombreux services sur votre système. La plupart des installations de logiciels installent des services ici. Le second est /etc/systemd/system/
, qui remplace le /lib/systemd
répertoire et est généralement utilisé pour placer des services créés par les utilisateurs. Il existe également /etc/systemd/users/
, qui exécute des services pour les utilisateurs connectés individuels, tels que la récupération du courrier.
Beaucoup de ces services ne fonctionnent pas tout le temps comme le feraient nginx ou MySQL. Vous pouvez imprimer une liste des services actuellement utilisés avec:
service --status-all
Les services avec un symbole «+» sont en cours d'exécution et les services avec un symbole «-» sont actuellement arrêtés. Vous pouvez afficher des informations plus détaillées avec:
service status nginx
Étant donné que les services s'exécutent en arrière-plan, ils n'enregistrent pas leur sortie sur votre console, mais en enregistrant la sortie dans le journal systemd. La commande «status» affichera les dernières lignes de ce journal, mais vous pouvez le lire directement avec:
journalctl -fn 50 -u nginx
Cette commande imprime les 50 entrées de journal les plus récentes (-n
) du service nginx (-u
). Il est configuré pour tout imprimer et commencer par le bas, en suivant les nouvelles entrées de journal lors de leur création (-f
).
Bien sûr, de nombreuses applications écrivent toujours la plupart des choses dans leurs journaux d'accès ou d'erreur, alors assurez-vous de les vérifier également. Le journal garde une trace des choses enregistrées directement sur la console, ce qui peut être utile pour déboguer vos propres services.
Configuration simple du service
Systemd est utilisé pour beaucoup de choses sous Linux; chaque objet qu'il gère est appelé une unité et possède un «fichier d'unité» correspondant définissant ce qu'il est. Il peut s'agir de services simples comme nginx ou MySQL, mais il peut également s'agir de points de montage, de périphériques, de sockets et de nombreux autres éléments sous le capot, tous gérés par systemd. Les unités peuvent également être des cibles, utilisées pour contrôler quand d'autres services s'exécuteront (c'est-à-dire après l'initialisation du réseau).
Pour ce cas d'utilisation, vous souhaiterez probablement simplement configurer votre application en tant que service de base. Pour ce faire, vous devrez créer un nouveau fichier d'unité, que vous voudrez placer dans /etc/systemd/system/
et nom avec un .service
extension:
touch /etc/systemd/system/myapp.service
Les fichiers d'unité ont quelques sections différentes, mais dans l'ensemble, cela ressemblera à ceci:
(Unit) Description=Example Service After=network.target StartLimitIntervalSec=0 (Service) Type=simple Restart=always RestartSec=1 User=serviceuser ExecStartPre= ExecStart=/path/to/executable (options) ExecStartPost ExecStop= ExecReload= (Install) WantedBy=multi-user.target
Tout d'abord, le (Unit)
, qui définit un ensemble de métadonnées sur l'unité. le After=
La directive peut être utilisée pour retarder l'activation de l'unité jusqu'à ce qu'une autre unité soit démarrée, comme network
ou un autre service, comme mysql.service
Cela ne fait pas de lui une personne à charge de ce service, mais vous pouvez le faire avec le Requires=
ou Wants=
directives. Cette section configure également le nombre maximum de fois que l'unité tentera de démarrer avant que systemd n'abandonne complètement; étant donné que vous voulez probablement qu'il continue d'essayer, vous pouvez le régler sur 0 pour désactiver ce comportement.
Vient ensuite le (Service)
, spécifique aux fichiers d'unité de service. C'est ici que vous configurerez les options Exec. User
exécutera le service en tant qu'un certain utilisateur. Vous pouvez définir cela sur votre compte d'utilisateur personnel, root ou un compte de service personnalisé. Assurez-vous simplement que l'utilisateur dispose des autorisations suffisantes pour faire son travail.
Il existe ici quelques directives différentes pour spécifier les programmes à exécuter. ExecStartPre
s'exécutera en premier, vous permettant d'effectuer toute configuration nécessaire avant que le service ne démarre réellement. ExecStart
est le principal exécutable. ExecStartPost
court après, et ExecStop
est exécuté lorsque le service s'arrête. ExecReload
est une directive spéciale et est utilisée lorsque vous appelez «recharger» au lieu de redémarrer. Cela vous permet d'effectuer un rechargement au moment de l'exécution de la configuration, à condition que votre application en ait la capacité.
Enfin, le (Install)
, qui définit un comportement plus lié à la façon dont systemd gère l'unité. Ceci est le plus souvent utilisé pour spécifier le WantedBy=
, qui est utilisée pour indiquer à systemd quand démarrer votre service et crée des liens symboliques entre les cibles et leurs unités dépendantes. Si vous ne savez pas quelle cible utiliser, multi-user.target
exécutera les services au démarrage après que presque tout soit chargé.
Dans l'ensemble, la configuration est assez simple, et tout ce que vous avez à faire est de mettre votre exécutable en argument dans le (Service)
section. Une fois votre service créé, vous devrez recharger le démon systemctl pour mettre à jour vos modifications:
sudo systemctl daemon-reload
Et activez-le (qui le lancera au démarrage, selon la configuration de l'unité):
sudo systemctl enable myapp
Et puis démarrez le service:
sudo service myapp start
Le service doit maintenant s'exécuter en arrière-plan et vous pouvez vérifier journalctl
pour regarder sa sortie. S'il sort, systemd
le redémarrera automatiquement et devrait s'exécuter au démarrage avec les autres services de votre système.
Si vous devez redémarrer votre service, vous pouvez utiliser:
sudo service myapp restart
Qui exécutera le ExecStop=
, arrêtez l'unité, puis redémarrez-la.