Démarrage automatique d'un service Linux au boot (systemctl enable)
Rendre un service Linux automatique au démarrage avec systemctl enable, vérifier avec is-enabled, comprendre enabled, enabled-runtime, static et masked.
L’issue s’ouvre déjà remplie avec le titre et l’adresse de cette page.
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
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.
Le schéma pose les deux axes côte à côte. Chaque flèche porte la commande qui fait passer d'un état à l'autre : start et stop ne changent rien à droite, enable et disable rien à gauche. C'est pour cela que enable --now existe : il enchaîne les deux gestes. Une unité static, sans section [Install], ne s'active pas du tout : la section « Un service static ne s'active pas » explique pourquoi.
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.
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/.
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
sudosystemctlenablenginx
Synchronizing state of nginx.service with SysV service script with /usr/lib/systemd/systemd-sysv-install.
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.
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
systemctlis-enabled--quietnginx; 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.
Le lien symbolique disparaît, donc le service ne repartira plus au boot. En revanche il continue de tourner s'il était actif : disablene 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
sudosystemctlmasknginx
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
sudosystemctlstartnginx
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-enabledne répond pas seulementenabled 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.
État
Ce que ça signifie
Exemple relevé
enabled
Activé au boot, lien symbolique présent dans /etc/systemd/system/
nginx.service
enabled-runtime
Activé jusqu'au prochain reboot seulement, lien créé dans /run/, donc en mémoire
systemd-remount-fs.service
disabled
Pas d'autostart, aucun lien, mais le service reste démarrable à la main
debug-shell.service
static
Aucune section [Install], l'unité ne s'active pas, elle est tirée comme dépendance
systemd-tmpfiles-clean.service
masked
Démarrage interdit, l'unité pointe sur /dev/null
console-getty.service
alias
Le nom n'est qu'un autre nom pour une unité existante
kmod.service
Glissez pour voir
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
sudosystemctlenable--runtimenginx
systemctlis-enablednginx
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
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
sudosystemctlenablesystemd-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
systemctlcatnginx.service
[Unit]
Description=A high performance web server and a reverse proxy server
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.
Cible
Ancien runlevel
Quand elle est atteinte
multi-user.target
3
Serveur en réseau sans interface graphique, le cas normal en production
graphical.target
5
Poste ou serveur avec environnement graphique
rescue.target
1
Mode maintenance, un minimum de services, souvent mono-utilisateur
Glissez pour voir
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é :
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
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 reenablesupprime 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.
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
sudoreboot
À la reconnexion, contrôlez les deux choses qui comptent, l'état du service et l'absence d'unité en échec :
Fenêtre de terminal
systemctlis-activenginx
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-enabledrévèle la vérité.
Symptôme
Cause probable
Correction
Le service est arrêté après chaque reboot
enable n'a jamais été exécuté, seulement start
sudo systemctl enable --now nginx puis systemctl is-enabled nginx
is-enabled répond enabled-runtime
Activation faite avec --runtime, elle vit en mémoire
Rejouer sudo systemctl enable nginx sans --runtime
Failed to enable unit: ... is masked
Le 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'écran
Service déjà activé (commande idempotente) ou paquet à script SysV
Ne pas se fier au message, trancher avec systemctl is-enabled nginx
Le service démarre mais pas dans le bon contexte de boot
WantedBy= pointe la mauvaise cible
Corriger la section [Install] puis sudo systemctl reenable nginx
enabled mais absent après reboot
L'activation est bonne, c'est le démarrage qui échoue
journalctl -b -u nginx pour lire l'erreur réelle
Glissez pour voir
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.
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.
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 enabledé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.
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
⏱️--:--
0 / 6
Vérification
(0/0)
--:--
0%
0Correctes
0À revoir
0:00Temps
-Niveau
Score par domaine
Un domaine regroupe plusieurs guides et reçoit plusieurs questions : son score est plus fiable qu'un score par thème, qui porte souvent sur une seule question.
Bilan
Points forts
Aucun sujet réussi à 80 % sur au moins deux questions pour l’instant.