Dans la leçon 21, nous avons vu comment gérer les services avec systemctl basique. Ici, nous allons plus loin : comprendre les fichiers unit, les créer, les modifier et maîtriser les options avancées.
systemd est le système d'initialisation utilisé par la plupart des distributions Linux modernes (Ubuntu, Debian, Fedora, Arch...). Il gère le démarrage, les services, les sockets, les timers et bien plus.
# Lancer / arrêter / redémarrer un servicesudo systemctl start nginxsudo systemctl stop nginxsudo systemctl restart nginx# Activer au démarrage / désactiversudo systemctl enable nginxsudo systemctl disable nginx# Vérifier le statutsystemctl status nginxUn fichier unit définit une unité de travail pour systemd. Il existe plusieurs types :
| Type | Extension | Description |
|---|---|---|
Service | .service | Démarre un processus (nginx, apache, mysql...) |
Socket | .socket | Un socket AF_UNIX ou réseau, déclenche un service à la connexion |
Timer | .timer | Planification temporelle (comme cron, voir leçon 41) |
Path | .path | Surveille un fichier/répertoire et déclenche un service |
Mount | .mount | Monte un système de fichiers |
Target | .target | Groupe d'unités (comme runlevels, ex: multi-user.target) |
# Unités système (globales)/etc/systemd/system/ # Créées par l'administrateur/usr/lib/systemd/system/ # Installées par les paquets/run/systemd/system/ # Runtime (temporaire)Pour un service utilisateur, c'est dans ~/.config/systemd/user/.
Regardons un exemple concret. affiche son contenu :
cat /lib/systemd/system/sshd.service[Unit]Description=OpenSSH server daemonAfter=network.target[Service]Type=notifyExecStart=/usr/sbin/sshd -D $SSHD_OPTIONSRestart=alwaysKillMode=mixed[Install]WantedBy=multi-user.target[Unit]Description=Mon service personnalisé # Description lisibleDocumentation=https://monsite.com # Docs (optionnel)After=network.target mysql.service # Démarre APRÈS ces unitésBefore=nginx.service # Démarre AVANT cette unitéRequires=mysql.service # Dépendance stricte (échoue si absent)Wants=redis.service # Dépendance souple (démarre même si absent)[Service]Type=simple # Le programme ne fait pas de fork (defaut)# Type=forking # Le programme fait un fork (PID attendu)# Type=oneshot # Une seule exécution puis s'arrête# Type=notify # Le programme notifie systemd quand prêt# Type=dbus # Le service apparaît sur D-BusExecStart=/usr/bin/mon_script.sh # Commande de démarrageExecStop=/usr/bin/mon_script.sh --stop # Commande d'arrêt (optionnel)ExecReload=/bin/kill -HUP $MAINPID # Commande de reloadRestart=always # Redémarre en cas d'échec# Restart=on-failure # Redémarre uniquement en cas d'erreur# Restart=no # Ne redémarre jamaisRestartSec=5 # Pause de 5 secondes avant redémarrageTimeoutStartSec=30 # Temps max pour démarrerTimeoutStopSec=10 # Temps max pour arrêterUser=www-data # Utilisateur qui exécute le processusGroup=www-data # Groupe du processusWorkingDirectory=/var/www # Répertoire de travailEnvironment="PORT=8080" "ENV=prod" # Variables d'environnementEnvironmentFile=/etc/monapp.env # Fichier variablesPIDFile=/run/monapp.pid # Fichier PID (pour Type=forking)StandardOutput=journal # Sortie vers les logsStandardError=journal # Erreurs vers les logs[Install]WantedBy=multi-user.target # S'active au boot en mode multi-utilisateur# WantedBy=graphical.target # Pour un environnement graphique# WantedBy=default.target # Pour les services utilisateurAlso=autre-service.service # Active/désactive aussi cette unitéCrée d'abord ton script :
#!/bin/bash# /opt/monapp/mon_script.shwhile true; do echo "Mon app tourne..." sleep 10donechmod +x /opt/monapp/mon_script.shCrée le fichier unit :
sudo nano /etc/systemd/system/monapp.service[Unit]Description=Mon application personnaliséeAfter=network.target[Service]Type=simpleExecStart=/opt/monapp/mon_script.shRestart=alwaysRestartSec=5User=root[Install]WantedBy=multi-user.targetActive le service :
sudo systemctl daemon-reload # Recharger systemd après modificationsudo systemctl enable --now monapp # Activer et démarrersystemctl status monapp # Vérifier# Lister toutes les unités activessystemctl list-units --type=service --state=running# Lister tous les services (actifs et inactifs)systemctl list-unit-files --type=service# Lister les services activés au bootsystemctl list-dependencies multi-user.target# Voir les services qui ont échouésystemctl --failed --type=service# Relancer (stop + start)sudo systemctl try-restart nginx# Recharger la config sans redémarrersudo systemctl reload nginx# Forcer l'arrêt (kill)sudo systemctl kill -s SIGTERM monapp# Masquer (rend impossible à démarrer)sudo systemctl mask nginx# Démasquersudo systemctl unmask nginx# Voir si activé au bootsystemctl is-enabled nginx# Voir si actif (en cours d'exécution)systemctl is-active nginx# Voir les dépendances d'un servicesystemctl list-dependencies nginx# Voir les propriétés d'une unitésystemctl show nginx | grep -E "MainPID|ExecStart|LoadState"Les targets regroupent des unités. Les plus courantes :
| Target | Usage |
|---|---|
basic.target | Configuration de base |
sysinit.target | Initialisation du système |
local-fs.target | Montage des systèmes de fichiers locaux |
network.target | Réseau disponible |
multi-user.target | Mode multi-utilisateur (sans GUI) |
graphical.target | Mode graphique (avec GUI) |
poweroff.target | Arrêt de la machine |
reboot.target | Redémarrage |
# Changer de targetsudo systemctl isolate multi-user.target# Définir le target par défautsudo systemctl set-default multi-user.target# Voir le target actuelsystemctl get-defaultsudo systemctl daemon-reloadjournalctl -u monapp -f (suivre en temps réel) ou -n 50 (50 dernières lignes)simpleEnvironmentFile pour les variables sensibles au lieu de les mettre en dur# 1. Statut détaillésystemctl status monapp# 2. Logs du servicejournalctl -u monapp -e # logs depuis le débutjournalctl -u monapp --since today # logs du jour# 3. Tester la commande ExecStart manuellement/opt/monapp/mon_script.sh# 4. Valider la syntaxe du fichier unitsystemd-analyze verify /etc/systemd/system/monapp.service| Option | Description |
|---|---|
Type=simple | Processus principal sans fork |
Type=forking | Processus qui fait un fork |
Type=oneshot | Exécution unique puis arrêt |
ExecStart | Commande de démarrage |
ExecStop | Commande d'arrêt |
Restart=always | Redémarre toujours |
Restart=on-failure | Redémarre en cas d'erreur |
After= | Démarre après ces unités |
Wants= | Démarre aussi si ces unités sont présentes |
User= | Utilisateur qui exécute le service |
Environment= | Variables d'environnement |
WantedBy= | Target qui déclenche l'activation |