SLBCloud
Intermédiaire8 min de lecture

Démarrer, arrêter et créer un service

systemctl au quotidien, la différence entre start et enable, et comment transformer son programme en service qui repart tout seul.

Sur toutes les distributions modernes, systemd décide de ce qui tourne. Cinq commandes couvrent la quasi-totalité des besoins.

bash
sudo systemctl status nginx     # comment il va, et ses dernières lignes de journal
sudo systemctl start nginx      # le démarrer maintenant
sudo systemctl stop nginx       # l'arrêter maintenant
sudo systemctl restart nginx    # l'arrêter puis le redémarrer
sudo systemctl reload nginx     # relire la configuration sans couper les connexions

reload plutôt que restart

reload demande au service de relire sa configuration sans s'arrêter : les visiteurs en cours ne voient rien. Tous les services ne le savent pas faire, mais nginx, postgresql et sshd oui. Prenez l'habitude d'essayer reload d'abord.

start n'est pas enable

C'est la confusion la plus fréquente, et elle se paie au premier redémarrage. start lance le service maintenant. enable lui dit de se lancer aussi aux prochains démarrages de la machine. Les deux sont indépendants : un service démarré mais non activé disparaît au reboot.

bash
sudo systemctl enable --now mon-service   # activer ET démarrer, en une fois
sudo systemctl is-enabled mon-service    # vérifier
sudo systemctl disable mon-service       # ne plus démarrer au boot

Faire de son programme un service

Un programme lancé dans un terminal meurt quand la session SSH se ferme. Un service systemd, lui, démarre au boot, repart s'il plante, et ses messages atterrissent dans le journal.

/etc/systemd/system/mon-appli.service

ini
[Unit]
Description=Mon application
After=network.target

[Service]
Type=simple
User=appli
WorkingDirectory=/opt/mon-appli
ExecStart=/usr/bin/node /opt/mon-appli/index.js
Restart=always
RestartSec=5
Environment=NODE_ENV=production

[Install]
WantedBy=multi-user.target
bash
sudo systemctl daemon-reload
sudo systemctl enable --now mon-appli
sudo systemctl status mon-appli

daemon-reload, sinon rien ne change

systemd garde les définitions en mémoire. Après avoir créé ou modifié un fichier .service, daemon-reload est obligatoire — sans lui, systemd continue d'appliquer l'ancienne version, et vous cherchez pendant vingt minutes pourquoi votre correction n'a aucun effet.

Quelques réglages qui servent

DirectiveCe qu'elle fait
Restart=alwaysRepart quoi qu'il arrive, même après un arrêt propre
Restart=on-failureRepart seulement en cas d'erreur — souvent le bon choix
RestartSec=5Attend cinq secondes avant de retenter, pour ne pas s'emballer
User=Fait tourner le service sous un compte sans privilèges
EnvironmentFile=Charge les variables depuis un fichier, secrets compris
After=Attend qu'un autre service soit prêt (réseau, base de données)

Voir ce qui tourne, et ce qui a échoué

bash
systemctl list-units --type=service --state=running
systemctl --failed          # les services en erreur
systemd-analyze blame       # ce qui ralentit le démarrage

Bloqué malgré tout ? Ouvrez un ticket : on répond en français, et on regarde votre machine si besoin.

Ouvrir un ticket