Prérequis
- Un serveur Linux moderne (Ubuntu 20.04+, Debian 11+, AlmaLinux 9, Rocky Linux 9)
- Accès root ou sudo
systemd est le système d'initialisation standard sur la plupart des distributions Linux modernes. Il gère le démarrage du système et les services (daemons). Les commandes systemd sont identiques sur Ubuntu, Debian, AlmaLinux et Rocky Linux.
1. Commandes de base
# Voir le statut d'un service
systemctl status nginx
# Démarrer un service
systemctl start nginx
# Arrêter un service
systemctl stop nginx
# Redémarrer un service
systemctl restart nginx
# Recharger la configuration (sans redémarrage)
systemctl reload nginx
# Activer au démarrage
systemctl enable nginx
# Désactiver au démarrage
systemctl disable nginx
# Activer ET démarrer
systemctl enable --now nginx2. Voir les services
# Tous les services
systemctl list-units --type=service
# Services actifs
systemctl list-units --type=service --state=running
# Services échoués
systemctl list-units --type=service --state=failed
# Services activés au démarrage
systemctl list-unit-files --type=service --state=enabled
# Rechercher un service
systemctl list-units | grep mysql3. Voir les logs avec journalctl
# Logs d'un service
journalctl -u nginx
# Logs en temps réel
journalctl -u nginx -f
# Logs depuis le dernier démarrage
journalctl -u nginx -b
# Logs des dernières 24h
journalctl -u nginx --since "24 hours ago"
# Logs d'aujourd'hui
journalctl -u nginx --since today
# Dernières 100 lignes
journalctl -u nginx -n 100
# Logs d'erreur seulement
journalctl -u nginx -p err
# Tous les logs système
journalctl -xe4. Créer un service personnalisé
# Les fichiers service sont dans /etc/systemd/system/
nano /etc/systemd/system/mon-application.service[Unit]
Description=Mon Application
After=network.target
[Service]
Type=simple
User=www-data
Group=www-data
WorkingDirectory=/var/www/mon-app
ExecStart=/usr/bin/node /var/www/mon-app/server.js
Restart=on-failure
RestartSec=10
# Variables d'environnement
Environment=NODE_ENV=production
Environment=PORT=3000
# Ou charger depuis un fichier
# EnvironmentFile=/etc/mon-app/env
# Logs
StandardOutput=journal
StandardError=journal
SyslogIdentifier=mon-app
[Install]
WantedBy=multi-user.target# Recharger systemd après création/modification
systemctl daemon-reload
# Activer et démarrer
systemctl enable --now mon-application
# Vérifier
systemctl status mon-application5. Types de services
# simple : Le processus principal est celui lancé par ExecStart (défaut)
Type=simple
# forking : Le processus se fork et le parent se termine
Type=forking
PIDFile=/var/run/mon-app.pid
# oneshot : Pour les scripts qui s'exécutent une fois
Type=oneshot
RemainAfterExit=yes
# notify : Le service signale quand il est prêt
Type=notify
# idle : Comme simple, mais attend que tous les jobs soient finis
Type=idle6. Options de redémarrage
# Redémarrer en cas d'échec
Restart=on-failure
# Toujours redémarrer
Restart=always
# Ne jamais redémarrer
Restart=no
# Redémarrer sauf si arrêt propre
Restart=on-abnormal
# Délai avant redémarrage
RestartSec=10
# Nombre max de redémarrages
StartLimitBurst=5
StartLimitIntervalSec=607. Exemples de services courants
Service Python
[Unit]
Description=Python Application
After=network.target
[Service]
Type=simple
User=python-app
WorkingDirectory=/opt/python-app
ExecStart=/opt/python-app/venv/bin/python app.py
Restart=always
Environment=PYTHONUNBUFFERED=1
[Install]
WantedBy=multi-user.targetService avec script shell
[Unit]
Description=Backup Service
[Service]
Type=oneshot
ExecStart=/opt/scripts/backup.sh
User=root
# Pas de [Install] car lancé par un timer8. Timers (alternative à cron)
[Unit]
Description=Backup Timer
[Timer]
# Tous les jours à 3h00
OnCalendar=*-*-* 03:00:00
# Ou toutes les 6 heures
# OnCalendar=*-*-* 0/6:00:00
# Ou 15 min après le démarrage
# OnBootSec=15min
# Persistant (rattraper si manqué)
Persistent=true
[Install]
WantedBy=timers.target# Activer le timer (pas le service !)
systemctl enable --now backup.timer
# Lister les timers
systemctl list-timers
# Exécuter manuellement
systemctl start backup.service9. Dépendances entre services
[Unit]
Description=Mon Application
# Démarrer après ces services
After=network.target mysql.service
# Requiert ces services (échoue si absent)
Requires=mysql.service
# Souhaite ces services (n'échoue pas si absent)
Wants=redis.service
# Démarre avant ces services
Before=nginx.service10. Commandes avancées
# Voir la configuration d'un service
systemctl cat nginx
# Voir les propriétés
systemctl show nginx
# Masquer un service (empêche tout démarrage)
systemctl mask nginx
systemctl unmask nginx
# Analyser le temps de démarrage
systemd-analyze
systemd-analyze blame
systemd-analyze critical-chain
# Recharger tous les daemons
systemctl daemon-reload
# Redémarrer le serveur
systemctl reboot
# Éteindre
systemctl poweroffsystemd maîtrisé !
Vous savez maintenant gérer les services Linux avec systemd. C'est la base de l'administration système moderne.