Aller au contenu
Administration Linux medium

Activer un service au démarrage sous Linux avec systemctl

10 min de lecture

systemctl enable crée un lien symbolique qui dit à systemd de démarrer un service automatiquement au prochain boot. Sans cette activation, un service installé et démarré manuellement ne survivra pas à un redémarrage. C'est l'une des premières tâches de tout administrateur après l'installation d'un service.

  • Activer un service pour qu'il démarre automatiquement au boot
  • Vérifier l'état d'activation avec systemctl is-enabled
  • Comprendre le mécanisme WantedBy et les liens symboliques
  • Distinguer les états enabled, disabled, static et masked
  • Combiner activation et démarrage en une seule commande
  • Diagnostiquer un service qui ne s'active pas au boot

L'activation au démarrage intervient systématiquement en administration :

  • Vous installez Nginx ou Apache, le service doit redémarrer automatiquement après une maintenance ou une coupure de courant
  • Vous déployez une application métier packagée comme service systemd, elle doit être disponible dès le boot
  • Vous configurez sshd, firewalld ou fail2ban, ces services de sécurité doivent être actifs en permanence
  • Après un reboot planifié, vous constatez qu'un service critique est arrêté, il n'était pas activé
  • Vous préparez un serveur de production, chaque service doit être explicitement activé ou désactivé

Un service systemd a deux états indépendants :

ÉtatQuestionCommande
Active/InactiveLe service tourne-t-il maintenant ?systemctl status
Enabled/DisabledLe service démarrera-t-il au prochain boot ?systemctl is-enabled

Ces deux états se combinent :

CombinaisonSignification
Active + EnabledTourne maintenant, redémarrera au boot
Active + DisabledTourne maintenant, ne redémarrera pas au boot
Inactive + EnabledArrêté maintenant, démarrera au prochain boot
Inactive + DisabledArrêté et ne démarrera pas au boot
Fenêtre de terminal
sudo systemctl enable nginx
Created symlink /etc/systemd/system/multi-user.target.wants/nginx.service → /usr/lib/systemd/system/nginx.service.

La commande crée un lien symbolique dans le dossier de la cible multi-user.target. Au prochain boot, quand systemd atteint cette cible, il démarre tous les services liés.

Fenêtre de terminal
sudo systemctl enable --now nginx

Le flag --now combine enable + start. C'est la méthode recommandée lors de l'installation d'un service.

Fenêtre de terminal
systemctl is-enabled nginx
enabled

La commande retourne un code de sortie 0 si le service est activé, ce qui la rend utilisable dans des scripts :

Fenêtre de terminal
if systemctl is-enabled --quiet nginx; then
echo "Nginx est activé au démarrage"
fi
Fenêtre de terminal
sudo systemctl disable nginx
Removed symlink /etc/systemd/system/multi-user.target.wants/nginx.service.

Le lien symbolique est supprimé. Le service ne démarrera plus au boot, mais il continue de tourner si il était actif.

Fenêtre de terminal
sudo systemctl disable --now nginx

La commande systemctl is-enabled peut retourner plusieurs valeurs :

ÉtatSignification
enabledActivé au boot (lien symbolique présent)
disabledDésactivé au boot (pas de lien)
staticPas de section [Install], ne peut pas être activé directement, seulement tiré comme dépendance
maskedBloqué, impossible à démarrer, même manuellement
aliasLe nom est un alias vers une autre unité
indirectActivé indirectement par un autre service
generatedGénéré automatiquement (ex : SysV init compat)

Un service static n'a pas de section [Install] dans son fichier unité. Il ne peut pas être activé avec enable, il est conçu pour être démarré uniquement comme dépendance d'un autre service.

Fenêtre de terminal
systemctl is-enabled systemd-tmpfiles-clean.service
static

Masquer un service empêche son démarrage, même manuellement :

Fenêtre de terminal
sudo systemctl mask nginx
Created symlink /etc/systemd/system/nginx.service → /dev/null.

Le lien pointe vers /dev/null, toute tentative de démarrage échoue :

Fenêtre de terminal
sudo systemctl start nginx
Failed to start nginx.service: Unit nginx.service is masked.

Pour démasquer :

Fenêtre de terminal
sudo systemctl unmask nginx

L'activation repose sur la section [Install] du fichier unité :

Fenêtre de terminal
systemctl cat nginx.service
[Unit]
Description=A high performance web server and a reverse proxy server
After=network.target
[Service]
Type=forking
PIDFile=/run/nginx.pid
ExecStart=/usr/sbin/nginx
ExecReload=/bin/kill -s HUP $MAINPID
[Install]
WantedBy=multi-user.target
DirectiveRôle
WantedBy=multi-user.targetQuand enable est exécuté, crée un lien dans multi-user.target.wants/
RequiredBy=Comme WantedBy mais avec une dépendance forte
Also=Active aussi d'autres unités en même temps
CibleÉquivalentUsage
multi-user.targetRunlevel 3Serveur sans interface graphique (le plus courant)
graphical.targetRunlevel 5Bureau avec interface graphique
rescue.targetRunlevel 1Mode maintenance

La grande majorité des services serveur utilisent WantedBy=multi-user.target.

Fenêtre de terminal
systemctl list-dependencies multi-user.target --type=service

Lister tous les services et leur état d'activation

Section intitulée « Lister tous les services et leur état d'activation »
Fenêtre de terminal
systemctl list-unit-files --type=service
UNIT FILE STATE PRESET
cron.service enabled enabled
nginx.service enabled enabled
postgresql.service disabled enabled
cups.service masked enabled
systemd-tmpfiles-clean.service static -

La colonne PRESET indique l'état par défaut défini par la distribution.

Fenêtre de terminal
sudo systemctl reenable nginx

Supprime puis recrée les liens symboliques. Utile si le fichier unité a été modifié (changement de WantedBy).

Les distributions définissent des presets qui déterminent quel service est activé par défaut à l'installation :

Fenêtre de terminal
systemctl preset nginx

Applique le preset de la distribution. Sur Debian/Ubuntu, la plupart des services sont activés par défaut à l'installation (enabled dans PRESET).

SymptômeCause probableSolution
Service arrêté après rebootenable jamais exécutésudo systemctl enable --now service
Failed to enable: Unit is maskedService masquésudo systemctl unmask service puis enable
enable sans effet, pas de lien crééPas de section [Install]Service static, activé via une dépendance
is-enabled retourne indirectActivé via un autre serviceVérifier avec systemctl show -p TriggeredBy
Service activé mais ne démarre pasErreur dans le fichier unitéjournalctl -xeu service pour le diagnostic
Lien créé vers la mauvaise cibleWantedBy incorrectModifier le fichier unité et reenable
Fenêtre de terminal
# Diagnostic rapide
systemctl is-enabled nginx # État d'activation
systemctl cat nginx.service # Contenu du fichier unité
ls -la /etc/systemd/system/multi-user.target.wants/ # Liens symboliques
systemctl list-unit-files --type=service # Vue globale
  • Toujours utiliser --now lors de la mise en place : enable --now et disable --now pour éviter d'oublier une des deux actions
  • Vérifier après un reboot, tester que les services critiques sont bien actifs après un reboot planifié
  • Désactiver explicitement les services inutiles plutôt que de les laisser installés et activés (réduction de la surface d'attaque)
  • Masquer les services vraiment indésirables (cups, avahi, bluetooth sur un serveur)
  • Documenter les services activés sur un serveur, systemctl list-unit-files --state=enabled donne l'inventaire
  • systemctl enable crée un lien symbolique pour que le service démarre au boot, disable le supprime
  • --now combine activation + démarrage (ou désactivation + arrêt) en une seule commande
  • Un service peut être actif sans être activé (et inversement), ce sont deux états indépendants
  • is-enabled vérifie l'état : enabled, disabled, static, masked
  • mask bloque totalement un service, plus fort que disable
  • Le mécanisme repose sur la directive WantedBy dans la section [Install] du fichier unité
  • La plupart des services serveur utilisent multi-user.target comme cible d'activation

Ce site vous est utile ?

Sachez que moins de 1% des lecteurs soutiennent ce site.

Je maintiens +700 guides gratuits, sans pub ni tracking. Un soutien, même symbolique, m'aide à couvrir l'hébergement et à garder ces ressources gratuites. Merci pour votre appui.

Le formulaire ne s'affiche pas ? Ouvrir Ko-fi dans un onglet.

Abonnez-vous et suivez mon actualité DevSecOps sur LinkedIn