Aide en ligne
Tous les articles

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 :

ServiceDebian, UbuntuRHEL, AlmaLinux, Rocky, Fedora
Apacheapache2httpd
MySQL / MariaDBmysql ou mariadbmysqld ou mariadb
SSHsshsshd
Nginx, vsftpdnginx, vsftpdnginx, 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

CommandeEffet
sudo systemctl disable nomne démarre plus au boot (le service en cours continue de tourner)
sudo systemctl start nom / stop / restartdémarrer, arrêter, redémarrer maintenant
sudo systemctl reload nomrelire la configuration sans couper le service (si le service le gère)
sudo systemctl mask nominterdit 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.