Démarrer automatiquement un service Linux avec systemd
Après un redémarrage, les services essentiels d'un serveur (serveur web, base de données, SSH…) doivent se relancer sans intervention. Sur la plupart des distributions actuelles (Debian, Ubuntu, Fedora, AlmaLinux, Rocky Linux), c'est systemd qui gère le démarrage, avec la commande systemctl.
Activer un service au démarrage
sudo systemctl enable nom_du_service
Cette commande programme le service pour qu'il démarre au prochain redémarrage, mais ne le lance pas tout de suite. Pour faire les deux en une fois :
sudo systemctl enable --now nom_du_service
Le nom du service varie selon la distribution :
| Service | Debian, Ubuntu | RHEL, AlmaLinux, Rocky, Fedora |
|---|---|---|
| Apache | apache2 | httpd |
| MySQL / MariaDB | mysql ou mariadb | mysqld ou mariadb |
| SSH | ssh | sshd |
| Nginx, vsftpd | nginx, vsftpd | nginx, vsftpd |
Pour retrouver le nom exact d'un service installé : systemctl list-unit-files --type=service | grep -i apache.
Vérifier
systemctl is-enabled httpd # enabled ou disabled systemctl status httpd # état actuel et dernières lignes du journal systemctl list-unit-files --type=service --state=enabled # tous les services activés au démarrage systemctl list-units --type=service --state=running # tous les services en cours d'exécution systemctl --failed # les services en échec
Désactiver, démarrer, arrêter
| Commande | Effet |
|---|---|
sudo systemctl disable nom | ne démarre plus au boot (le service en cours continue de tourner) |
sudo systemctl start nom / stop / restart | démarrer, arrêter, redémarrer maintenant |
sudo systemctl reload nom | relire la configuration sans couper le service (si le service le gère) |
sudo systemctl mask nom | interdit tout démarrage, même manuel ; unmask pour annuler |
Comprendre pourquoi un service n'a pas démarré
Le journal de systemd garde les messages de chaque service. Pour voir ceux du démarrage en cours :
journalctl -u httpd -b # messages du service httpd depuis le dernier démarrage journalctl -b -p err # toutes les erreurs depuis le dernier démarrage
Créer son propre service
Un script ou une application qui doit tourner en permanence peut devenir un service. Créez le fichier /etc/systemd/system/monapp.service :
[Unit] Description=Mon application After=network.target [Service] User=www-data WorkingDirectory=/opt/monapp ExecStart=/usr/bin/php /opt/monapp/worker.php Restart=on-failure [Install] WantedBy=multi-user.target
Dans ExecStart, écrivez toujours des chemins absolus. Puis faites relire les fichiers par systemd et activez le service :
sudo systemctl daemon-reload sudo systemctl enable --now monapp
Restart=on-failure relance le service s'il plante. WantedBy=multi-user.target indique qu'il doit démarrer avec le système en mode normal (sans interface graphique).
Lancer seulement une commande au démarrage
Pour exécuter une commande une seule fois au démarrage, une ligne @reboot dans la crontab est plus simple : voir Crontab : planifier des exécutions sous Linux. Dès que le programme doit être surveillé et relancé s'il s'arrête, préférez un service systemd.
Sur les anciennes distributions
Avant systemd, sur CentOS 5 et 6, les services se géraient avec chkconfig et service :
/sbin/chkconfig --list # liste des services et de leur état /sbin/chkconfig httpd on # démarrage automatique d'Apache /sbin/chkconfig mysqld on # démarrage automatique de MySQL service httpd start # démarrer le service maintenant
Sur les Debian et Ubuntu de la même époque, l'équivalent était update-rc.d apache2 defaults. CentOS 7 et les versions suivantes utilisent systemd, et CentOS Linux n'est plus maintenu : AlmaLinux ou Rocky Linux sont des remplaçants compatibles.