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é

Démarré vs activé — deux états indépendants

Section intitulée « Démarré vs activé — deux états indépendants »

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

Désactiver au boot (sans l’arrêter maintenant)

Section intitulée « Désactiver au boot (sans l’arrêter maintenant) »
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 tracing. Aujourd'hui, ce site ne couvre même pas mes frais d'hébergement, d'électricité, de matériel, de logiciels, mais surtout de cafés.

Un soutien régulier, même symbolique, m'aide à garder ces ressources gratuites et à continuer de produire des guides de qualité. Merci pour votre appui.

Abonnez-vous et suivez mon actualité DevSecOps sur LinkedIn