Aller au contenu
Administration Linux medium

Démarrage automatique d'un service Linux au boot (systemctl enable)

21 min de lecture

Le service tourne, vous redémarrez la machine, il est arrêté. Rien n'est cassé : il n'a jamais été activé au boot. La commande qui règle ça tient en une ligne, sudo systemctl enable --now nginx, et la seule vérification qui compte ensuite est systemctl is-enabled. Cette page couvre le démarrage automatique d'un service Linux avec systemd : activer, désactiver, masquer, lire les états d'activation, comprendre la cible qui déclenche le service, et savoir ce que is-enabled prouve réellement.

  • Rendre un service automatique au démarrage avec systemctl enable
  • Vérifier l'activation avec systemctl is-enabled et lire la sortie sans se tromper
  • Distinguer les états enabled, enabled-runtime, disabled, static, masked et alias
  • Comprendre le mécanisme WantedBy et les cibles (targets) qui déclenchent un service au boot
  • Masquer un service pour interdire tout démarrage, y compris manuel
  • Diagnostiquer un service qui ne repart pas après un redémarrage

Toutes les sorties de cette page proviennent d'un système Debian 13 (trixie) avec systemd 257 et Nginx comme service réel. Elles peuvent différer légèrement chez vous selon la distribution, et cette différence est justement un des pièges expliqués plus bas.

Démarré maintenant, automatique au boot : deux choses différentes

Section intitulée « Démarré maintenant, automatique au boot : deux choses différentes »

C'est la confusion qui envoie le plus de monde sur cette page. Un service systemd a deux états totalement indépendants : est-ce qu'il tourne en ce moment, et est-ce qu'il redémarrera tout seul au prochain boot. start répond au premier, enable répond au second.

Les deux états d'un service systemd : l'état runtime interrogé par is-active, et l'état d'activation interrogé par is-enabled

QuestionÉtatCommande
Le service tourne-t-il maintenant ?active / inactivesystemctl is-active nginx
Le service repartira-t-il au prochain boot ?enabled / disabledsystemctl is-enabled nginx

Les deux se combinent librement, et chaque combinaison correspond à une situation réelle d'exploitation :

CombinaisonCe que ça veut dire
active + enabledTourne et repartira au boot. L'état normal d'un service de production.
active + disabledTourne, mais disparaîtra au reboot. Le piège classique après une installation.
inactive + enabledArrêté maintenant, démarrera au prochain boot. Typique après un stop de maintenance.
inactive + disabledArrêté et ne reviendra pas. L'état d'un service volontairement écarté.

L'activation consiste à demander à systemd de se souvenir qu'il faut lancer ce service à chaque boot. Concrètement, systemd écrit un lien symbolique dans le répertoire de la cible qui déclenche le service. Ce lien vit sur le disque, donc il survit à un redémarrage.

Cas d'usage : vous préparez un serveur, le service doit être automatique au boot mais vous ne voulez pas encore l'exposer.

Fenêtre de terminal
sudo systemctl enable nginx
Synchronizing state of nginx.service with SysV service script with /usr/lib/systemd/systemd-sysv-install.
Executing: /usr/lib/systemd/systemd-sysv-install enable nginx
Created symlink '/etc/systemd/system/multi-user.target.wants/nginx.service' → '/usr/lib/systemd/system/nginx.service'.

Trois lignes, et deux d'entre elles ne parlent pas de systemd. Les paquets Debian et Ubuntu qui embarquent encore un script SysV (l'ancien système d'init) déclenchent une couche de compatibilité, systemd-sysv-install, dont les deux premières lignes sont le bavardage. La ligne utile est la troisième : le lien symbolique créé dans multi-user.target.wants/.

Section intitulée « Pourquoi vous ne voyez pas toujours « Created symlink » »

Beaucoup de lecteurs relancent la commande, ne voient plus que les deux lignes SysV, et croient à un échec. Il n'y en a aucun : enable est idempotent. Si le lien existe déjà, systemd n'a rien à créer et n'affiche rien de plus.

Fenêtre de terminal
sudo systemctl enable nginx
Synchronizing state of nginx.service with SysV service script with /usr/lib/systemd/systemd-sysv-install.
Executing: /usr/lib/systemd/systemd-sysv-install enable nginx

Sur une unité sans script SysV (la majorité des services modernes, et le cas général sur RHEL ou Fedora), les deux lignes de compatibilité disparaissent et il ne reste que le Created symlink. Retenez la règle : le message affiché dépend du paquet et de l'état antérieur, il ne prouve rien. La seule sortie qui fait autorité est celle de is-enabled.

C'est la forme à utiliser dans 99 % des installations, parce qu'elle supprime l'oubli le plus fréquent.

Fenêtre de terminal
sudo systemctl enable --now nginx
Synchronizing state of nginx.service with SysV service script with /usr/lib/systemd/systemd-sysv-install.
Executing: /usr/lib/systemd/systemd-sysv-install enable nginx
Created symlink '/etc/systemd/system/multi-user.target.wants/nginx.service' → '/usr/lib/systemd/system/nginx.service'.

Le drapeau --now ajoute un start à l'activation. Vérifiez les deux états derrière, pas un seul :

Fenêtre de terminal
systemctl is-active nginx && systemctl is-enabled nginx
active
enabled

is-enabled affiche l'état et positionne aussi un code de retour exploitable en automatisation. Avec --quiet, la commande n'affiche rien et se contente de rendre 0 si le service est activé.

Fenêtre de terminal
systemctl is-enabled --quiet nginx; echo "code=$?"
code=0

Ce couple sortie plus code retour est la base des contrôles de conformité : une boucle sur la liste des services critiques d'un serveur suffit à détecter celui qui a été démarré à la main et jamais activé.

Attention à un piège en automatisation : is-enabled renvoie aussi 0 pour les états static, alias, indirect, generated et transient, pas seulement pour enabled. Une boucle qui teste uniquement le code retour peut donc valider une unité static qui ne démarrera pourtant pas d'elle-même au boot. Pour un vrai contrôle, comparez la chaîne affichée à enabled (ou enabled-runtime), pas seulement le $?.

Désactiver retire le démarrage automatique sans toucher au service en cours. Masquer va beaucoup plus loin : le service devient impossible à démarrer, y compris à la main. Les deux répondent à des besoins différents, et les confondre mène soit à un service qui revient tout seul, soit à un service que plus personne n'arrive à relancer.

Fenêtre de terminal
sudo systemctl disable nginx
Synchronizing state of nginx.service with SysV service script with /usr/lib/systemd/systemd-sysv-install.
Executing: /usr/lib/systemd/systemd-sysv-install disable nginx
Removed '/etc/systemd/system/multi-user.target.wants/nginx.service'.

Le lien symbolique disparaît, donc le service ne repartira plus au boot. En revanche il continue de tourner s'il était actif : disable ne coupe rien. Pour désactiver et arrêter d'un coup, sudo systemctl disable --now nginx. Contrôlez avec systemctl is-enabled nginx, qui doit afficher disabled.

Masquer remplace l'unité par un lien vers /dev/null. Plus rien ne peut la démarrer : ni vous, ni une dépendance d'un autre service, ni un paquet qui se met à jour.

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

Toute tentative de démarrage échoue franchement, avec un message qui nomme la cause :

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

Un enable sur une unité masquée échoue lui aussi, avec un code retour 1 : Failed to enable unit: Unit /etc/systemd/system/nginx.service is masked. Pour revenir en arrière, sudo systemctl unmask nginx supprime le lien vers /dev/null et rend l'unité de nouveau gérable.

systemctl is-enabled ne répond pas seulement enabled ou disabled. Les états ci-dessous sont ceux que vous croiserez réellement sur un serveur, tous relevés sur le même système Debian 13. Les connaître évite de conclure trop vite qu'un service « n'est pas activé » alors qu'il est simplement conçu autrement.

ÉtatCe que ça signifieExemple relevé
enabledActivé au boot, lien symbolique présent dans /etc/systemd/system/nginx.service
enabled-runtimeActivé jusqu'au prochain reboot seulement, lien créé dans /run/, donc en mémoiresystemd-remount-fs.service
disabledPas d'autostart, aucun lien, mais le service reste démarrable à la maindebug-shell.service
staticAucune section [Install], l'unité ne s'active pas, elle est tirée comme dépendancesystemd-tmpfiles-clean.service
maskedDémarrage interdit, l'unité pointe sur /dev/nullconsole-getty.service
aliasLe nom n'est qu'un autre nom pour une unité existantekmod.service

L'état enabled-runtime, celui que tout le monde oublie

Section intitulée « L'état enabled-runtime, celui que tout le monde oublie »

systemctl enable --runtime active un service sans rien écrire sur le disque : le lien symbolique atterrit dans /run/systemd/system/, un système de fichiers en mémoire vidé à chaque redémarrage.

Fenêtre de terminal
sudo systemctl enable --runtime nginx
systemctl is-enabled nginx
Created symlink '/run/systemd/system/multi-user.target.wants/nginx.service' → '/usr/lib/systemd/system/nginx.service'.
enabled-runtime

C'est utile pour une activation temporaire pendant une intervention, quand vous voulez la garantie que l'état d'origine revient au reboot. C'est un piège redoutable dans le cas contraire : un is-enabled qui répond enabled-runtime ressemble à s'y méprendre à enabled, alors que le service ne repartira pas après un redémarrage. Si vous vouliez une activation durable, rejouez un sudo systemctl enable nginx sans --runtime.

Un service static ne s'active pas, et c'est normal

Section intitulée « Un service static ne s'active pas, et c'est normal »

Une unité static n'a pas de section [Install], donc systemd ne sait pas où accrocher le lien symbolique. Elle est prévue pour être tirée par une dépendance, un timer ou une activation à la demande.

Fenêtre de terminal
sudo systemctl enable systemd-tmpfiles-clean.service
The unit files have no installation config (WantedBy=, RequiredBy=, UpheldBy=,
Also=, or Alias= settings in the [Install] section, and DefaultInstance= for
template units). This means they are not meant to be enabled or disabled using systemctl.

systemd vous explique lui-même la situation et ne crée aucun lien. Rien à réparer : si vous vouliez rendre ce service automatique au boot, c'est le fichier unité qu'il faut compléter, pas la commande qu'il faut changer.

Un service ne démarre pas « au boot » dans l'absolu. Il démarre parce qu'une cible (target) atteinte pendant le démarrage le réclame. La section [Install] du fichier unité indique laquelle, et c'est exactement ce que enable lit pour savoir dans quel répertoire poser le lien.

Fenêtre de terminal
systemctl cat nginx.service
[Unit]
Description=A high performance web server and a reverse proxy server
After=network-online.target remote-fs.target nss-lookup.target
Wants=network-online.target
ConditionFileIsExecutable=/usr/sbin/nginx
[Service]
Type=forking
PIDFile=/run/nginx.pid
ExecStart=/usr/sbin/nginx -g 'daemon on; master_process on;'
[Install]
WantedBy=multi-user.target
Directive de [Install]Rôle à l'activation
WantedBy=multi-user.targetCrée le lien dans multi-user.target.wants/, dépendance souple : si le service échoue, la cible est quand même atteinte
RequiredBy=Même principe en dépendance forte : l'échec du service fait échouer la cible
Also=Enable d'autres unités en même temps (sans les démarrer), typiquement un socket associé. Joue aussi au disable

Les targets ont remplacé les runlevels de SysV, et les anciens noms survivent en simples alias : runlevel3.target pointe sur multi-user.target, runlevel5.target sur graphical.target, runlevel1.target sur rescue.target. Voir cette équivalence aide à lire les vieux scripts d'exploitation.

CibleAncien runlevelQuand elle est atteinte
multi-user.target3Serveur en réseau sans interface graphique, le cas normal en production
graphical.target5Poste ou serveur avec environnement graphique
rescue.target1Mode maintenance, un minimum de services, souvent mono-utilisateur

La quasi-totalité des services serveur déclarent WantedBy=multi-user.target. Et même si la machine boote en graphical.target, ils démarrent quand même : graphical.target déclare Requires=multi-user.target, donc elle englobe la cible multi-utilisateur. La cible visée au boot se lit avec systemctl get-default.

Deux commandes suffisent à répondre à « qu'est-ce qui démarre sur cette machine ». La première liste les services accrochés à la cible, la seconde donne l'état d'activation de tout ce qui est installé :

Fenêtre de terminal
systemctl list-dependencies multi-user.target --type=service
multi-user.target
nginx.service
systemd-logind.service
systemd-user-sessions.service
Fenêtre de terminal
systemctl list-unit-files --type=service --state=enabled
UNIT FILE STATE PRESET
getty@.service enabled enabled
nginx.service enabled enabled
systemd-pstore.service enabled enabled
3 unit files listed.

La colonne PRESET n'est pas l'état courant : c'est ce que la distribution recommande par défaut. Un enabled en PRESET et un disabled en STATE signalent un service que quelqu'un a désactivé volontairement, information précieuse quand vous reprenez un serveur que vous n'avez pas installé.

Presets et reenable : réparer une activation bancale

Section intitulée « Presets et reenable : réparer une activation bancale »

Deux commandes servent quand l'activation ne ressemble plus à ce qu'elle devrait être, typiquement après avoir modifié un fichier unité à la main.

systemctl reenable supprime puis recrée les liens à partir de la section [Install] courante. C'est le réflexe après avoir changé un WantedBy= : sans lui, l'ancien lien reste en place et le service continue d'être accroché à la mauvaise cible.

Fenêtre de terminal
sudo systemctl reenable nginx
Removed '/etc/systemd/system/multi-user.target.wants/nginx.service'.
Created symlink '/etc/systemd/system/multi-user.target.wants/nginx.service' → '/usr/lib/systemd/system/nginx.service'.

systemctl preset nginx remet le service dans l'état voulu par la distribution (la colonne PRESET). Debian et Ubuntu activent la plupart des services dès l'installation du paquet, RHEL est nettement plus conservateur. La commande ne dit rien quand il n'y a rien à changer, ce qui est le cas le plus fréquent ; vérifiez le résultat avec systemctl is-enabled nginx.

Une page honnête doit le dire clairement : is-enabled ne prouve pas que le service démarrera. Il prouve que l'intention d'activation est correctement enregistrée, c'est-à-dire que le lien symbolique existe au bon endroit. Le service peut parfaitement être enabled et échouer au boot, parce que sa configuration est cassée, parce qu'il attend un montage réseau qui n'est pas encore là, ou parce qu'une dépendance a été masquée.

La vérification qui fait foi est donc un vrai redémarrage, sur une machine où vous pouvez vous le permettre :

Fenêtre de terminal
sudo reboot

À la reconnexion, contrôlez les deux choses qui comptent, l'état du service et l'absence d'unité en échec :

Fenêtre de terminal
systemctl is-active nginx
systemctl --failed
active

Une sortie vide de systemctl --failed signifie qu'aucune unité n'a échoué au démarrage. Si votre service est activé mais absent après le reboot, le diagnostic se poursuit avec journalctl -b -u nginx, qui montre le journal du boot courant pour cette unité, et se prolonge dans Dépanner un service qui ne démarre pas.

Les symptômes ci-dessous couvrent l'essentiel de ce qui bloque une activation au démarrage. Le point commun de ces situations : la commande a l'air d'avoir fonctionné, seul is-enabled révèle la vérité.

SymptômeCause probableCorrection
Le service est arrêté après chaque rebootenable n'a jamais été exécuté, seulement startsudo systemctl enable --now nginx puis systemctl is-enabled nginx
is-enabled répond enabled-runtimeActivation faite avec --runtime, elle vit en mémoireRejouer sudo systemctl enable nginx sans --runtime
Failed to enable unit: ... is maskedLe service est masquésudo systemctl unmask nginx puis sudo systemctl enable --now nginx
enable affiche « no installation config »Unité static, pas de section [Install]Rien à corriger, le service est tiré par une dépendance ; sinon ajouter [Install] au fichier unité
Pas de « Created symlink » à l'écranService déjà activé (commande idempotente) ou paquet à script SysVNe pas se fier au message, trancher avec systemctl is-enabled nginx
Le service démarre mais pas dans le bon contexte de bootWantedBy= pointe la mauvaise cibleCorriger la section [Install] puis sudo systemctl reenable nginx
enabled mais absent après rebootL'activation est bonne, c'est le démarrage qui échouejournalctl -b -u nginx pour lire l'erreur réelle

Le trio de diagnostic tient en trois commandes : l'état d'activation, le contenu de l'unité, et les liens réellement posés sur le disque.

Fenêtre de terminal
systemctl is-enabled nginx
systemctl cat nginx.service
ls -l /etc/systemd/system/multi-user.target.wants/

L'activation au boot n'est pas qu'une commodité d'exploitation, c'est aussi une décision de surface d'attaque. Chaque service activé est un processus qui démarrera sans que personne le demande, souvent en écoutant sur le réseau.

  • Utiliser --now systématiquement à l'installation : enable --now pour mettre en service, disable --now pour retirer. L'oubli d'une des deux moitiés est l'erreur la plus courante.
  • Désactiver explicitement ce dont le serveur n'a pas besoin plutôt que de le laisser activé par le preset de la distribution, particulièrement sur Debian et Ubuntu qui activent presque tout à l'installation.
  • Masquer les services que vous voulez interdire pour de bon, en vérifiant d'abord qu'aucune autre unité n'en dépend.
  • Inventorier l'existant avec systemctl list-unit-files --state=enabled sur un serveur repris : c'est la liste exacte de ce qui remontera au prochain redémarrage.
  • Tester par un vrai reboot avant la mise en production. Un serveur qui n'a jamais rebooté depuis son installation est un serveur dont personne ne connaît le comportement au boot.
  • Automatiser l'activation dans votre gestion de configuration plutôt que de la refaire à la main sur chaque machine, ce qui garantit que l'état d'activation est le même partout.

Vérifiez que l'essentiel de ce guide est acquis. Les questions portent uniquement sur ce qui vient d'être expliqué ici.

Contrôle de connaissances

Validez vos connaissances avec ce quiz interactif

6 questions
6 min.
70% requis

Informations

  • Le chronomètre démarre au clic sur Démarrer
  • Questions à choix multiples, vrai/faux et réponses courtes
  • Vous pouvez naviguer entre les questions
  • Les résultats détaillés sont affichés à la fin

Lance le quiz et démarre le chronomètre

  • systemctl enable rend un service automatique au démarrage en créant un lien symbolique ; disable le retire ; --now ajoute le start ou le stop correspondant.
  • Un service peut être actif sans être activé, et inversement : is-active et is-enabled répondent à deux questions différentes.
  • Le message affiché par enable dépend du paquet et de l'état antérieur : les lignes Synchronizing state ... SysV sont de la compatibilité Debian, et Created symlink n'apparaît que si un lien est réellement créé. Seul is-enabled fait autorité.
  • enabled-runtime signifie activé jusqu'au prochain reboot seulement : le lien est dans /run/, il ne survit pas au redémarrage.
  • Une unité static n'a pas de section [Install] et ne s'active pas : elle est tirée comme dépendance.
  • mask interdit tout démarrage, y compris manuel et y compris par une dépendance ; c'est plus fort que disable.
  • L'activation repose sur WantedBy= dans la section [Install], et la cible multi-user.target est celle de la quasi-totalité des services serveur.
  • Seul un vrai reboot fait foi : is-enabled prouve l'intention d'activation, pas le succès du démarrage.

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