Services et systemd
Table des matières
- Introduction à systemd
- systemctl : commandes essentielles
- Activer/désactiver au démarrage
- Journaux avec journalctl
- Créer un service simple
- Exercices pratiques
1 - Introduction à systemd
Qu'est-ce que systemd ?
systemd est le système d'initialisation et le gestionnaire de services de la plupart des distributions Linux modernes.
Concepts clés
| Terme | Description |
|---|---|
| Unit | Ressource gérée par systemd |
| Service | Un type d'unit (démon) |
| Target | Groupe d'units (ex: multi-user.target) |
| Socket | Communication inter-processus |
| Timer | Équivalent moderne de cron |
Types d'units
| Extension | Type |
|---|---|
.service | Services/démons |
.socket | Sockets |
.target | Groupes d'units |
.timer | Tâches planifiées |
.mount | Points de montage |
.device | Périphériques |
Emplacement des fichiers
| Chemin | Description |
|---|---|
/lib/systemd/system/ | Units du système (packages) |
/etc/systemd/system/ | Units personnalisées (admin) |
~/.config/systemd/user/ | Units utilisateur |
🔝 Retour à la table des matières
2 - systemctl : commandes essentielles
Gestion des services
| Commande | Description |
|---|---|
systemctl start | Démarrer un service |
systemctl stop | Arrêter un service |
systemctl restart | Redémarrer |
systemctl reload | Recharger la configuration |
systemctl status | Voir l'état |
Exemples pratiques
# Démarrer nginx
sudo systemctl start nginx
# Arrêter nginx
sudo systemctl stop nginx
# Redémarrer (stop + start)
sudo systemctl restart nginx
# Recharger config sans interruption
sudo systemctl reload nginx
# Redémarrer si actif
sudo systemctl try-restart nginx
Voir l'état d'un service
sudo systemctl status nginx
Sortie typique :
● nginx.service - A high performance web server
Loaded: loaded (/lib/systemd/system/nginx.service; enabled; preset: enabled)
Active: active (running) since Mon 2024-01-15 10:30:00 UTC; 2h ago
Docs: man:nginx(8)
Process: 1234 ExecStartPre=/usr/sbin/nginx -t -q -g daemon on; (code=exited, status=0/SUCCESS)
Main PID: 1235 (nginx)
Tasks: 3 (limit: 4096)
Memory: 8.5M
CPU: 120ms
CGroup: /system.slice/nginx.service
├─1235 "nginx: master process /usr/sbin/nginx"
├─1236 "nginx: worker process"
└─1237 "nginx: worker process"
Lister les services
# Tous les services
systemctl list-units --type=service
# Services actifs
systemctl list-units --type=service --state=active
# Services en échec
systemctl list-units --type=service --state=failed
# Tous (y compris inactifs)
systemctl list-units --type=service --all
Vérifier si un service est actif
# Vérifie si actif
systemctl is-active nginx
# active ou inactive
# Vérifie si activé au démarrage
systemctl is-enabled nginx
# enabled ou disabled
# Vérifie si en échec
systemctl is-failed nginx
🔝 Retour à la table des matières
3 - Activer/désactiver au démarrage
Concepts
| Action | Effet |
|---|---|
enable | Démarre automatiquement au boot |
disable | Ne démarre pas au boot |
start | Démarre maintenant |
stop | Arrête maintenant |
remarque
enable ≠ start ! Enable configure le démarrage automatique mais ne lance pas le service immédiatement.
Commandes
# Activer au démarrage
sudo systemctl enable nginx
# Désactiver au démarrage
sudo systemctl disable nginx
# Activer ET démarrer
sudo systemctl enable --now nginx
# Désactiver ET arrêter
sudo systemctl disable --now nginx
Masquer un service
Pour empêcher totalement un service de démarrer :
# Masquer (impossible à démarrer)
sudo systemctl mask nginx
# Démasquer
sudo systemctl unmask nginx
Voir les services au démarrage
# Services activés
systemctl list-unit-files --type=service --state=enabled
# Services désactivés
systemctl list-unit-files --type=service --state=disabled
🔝 Retour à la table des matières
4 - Journaux avec journalctl
journalctl affiche les logs gérés par systemd-journald.
Commandes de base
# Tous les logs (peut être très long)
journalctl
# Logs d'un service spécifique
journalctl -u nginx
# Logs depuis le dernier boot
journalctl -b
# Logs en temps réel (comme tail -f)
journalctl -f
# Logs d'un service en temps réel
journalctl -u nginx -f
Filtrer par temps
# Depuis une date
journalctl --since "2024-01-15 10:00:00"
# Jusqu'à une date
journalctl --until "2024-01-15 12:00:00"
# Dernière heure
journalctl --since "1 hour ago"
# Aujourd'hui
journalctl --since today
# Hier
journalctl --since yesterday --until today
Filtrer par priorité
| Niveau | Signification |
|---|---|
| 0 | emerg |
| 1 | alert |
| 2 | crit |
| 3 | err |
| 4 | warning |
| 5 | notice |
| 6 | info |
| 7 | debug |
# Erreurs et plus grave
journalctl -p err
# Warnings et plus grave
journalctl -p warning
# Seulement les erreurs d'un service
journalctl -u nginx -p err
Options utiles
# Dernières N lignes
journalctl -n 50
# Format JSON
journalctl -o json-pretty
# Avec détails du boot
journalctl -b -1 # Boot précédent
# Espace utilisé par les logs
journalctl --disk-usage
# Nettoyer les vieux logs
sudo journalctl --vacuum-time=7d
sudo journalctl --vacuum-size=1G
🔝 Retour à la table des matières
5 - Créer un service simple
Structure d'un fichier service
[Unit]
Description=Description du service
After=network.target
[Service]
Type=simple
User=www-data
WorkingDirectory=/app
ExecStart=/usr/bin/python3 /app/server.py
Restart=always
RestartSec=5
[Install]
WantedBy=multi-user.target
Sections du fichier
| Section | Contenu |
|---|---|
| [Unit] | Métadonnées, dépendances |
| [Service] | Configuration du service |
| [Install] | Quand activer le service |
Options courantes
[Unit]
| Option | Description |
|---|---|
Description | Description du service |
After | Démarrer après ces units |
Requires | Dépendances obligatoires |
Wants | Dépendances optionnelles |
[Service]
| Option | Description |
|---|---|
Type | simple, forking, oneshot... |
ExecStart | Commande de démarrage |
ExecStop | Commande d'arrêt |
ExecReload | Commande de rechargement |
User | Utilisateur d'exécution |
WorkingDirectory | Répertoire de travail |
Restart | always, on-failure, no |
RestartSec | Délai avant redémarrage |
Environment | Variables d'environnement |
Exemple complet : Application Node.js
# Créer le fichier service
sudo nano /etc/systemd/system/myapp.service
[Unit]
Description=My Node.js Application
Documentation=https://github.com/user/myapp
After=network.target
[Service]
Type=simple
User=deploy
Group=deploy
WorkingDirectory=/app/myapp
ExecStart=/usr/bin/node server.js
Restart=always
RestartSec=10
StandardOutput=journal
StandardError=journal
Environment=NODE_ENV=production
Environment=PORT=3000
[Install]
WantedBy=multi-user.target
Activer le service
# Recharger systemd
sudo systemctl daemon-reload
# Activer et démarrer
sudo systemctl enable --now myapp
# Vérifier
sudo systemctl status myapp
# Voir les logs
journalctl -u myapp -f
Modifier un service existant
# Éditer avec override (recommandé)
sudo systemctl edit nginx
# Crée /etc/systemd/system/nginx.service.d/override.conf
# Voir la configuration complète
systemctl cat nginx
# Recharger après modification
sudo systemctl daemon-reload
sudo systemctl restart nginx
🔝 Retour à la table des matières
6 - Exercices pratiques
Exercice 1 : Gérer nginx
# 1. Installer nginx
sudo apt install nginx
# 2. Vérifier l'état
sudo systemctl status nginx
# 3. Arrêter nginx
sudo systemctl stop nginx
# 4. Vérifier qu'il est arrêté
sudo systemctl is-active nginx
# 5. Démarrer nginx
sudo systemctl start nginx
# 6. Voir les logs récents
journalctl -u nginx -n 20
Exercice 2 : Créer un service simple
# 1. Créer un script
sudo mkdir -p /opt/myservice
cat << 'EOF' | sudo tee /opt/myservice/app.sh
#!/bin/bash
while true; do
echo "Service running at $(date)"
sleep 30
done
EOF
sudo chmod +x /opt/myservice/app.sh
# 2. Créer le fichier service
cat << 'EOF' | sudo tee /etc/systemd/system/myservice.service
[Unit]
Description=My Test Service
[Service]
Type=simple
ExecStart=/opt/myservice/app.sh
Restart=always
[Install]
WantedBy=multi-user.target
EOF
# 3. Activer et démarrer
sudo systemctl daemon-reload
sudo systemctl enable --now myservice
# 4. Vérifier
sudo systemctl status myservice
journalctl -u myservice -f
# 5. Nettoyer
sudo systemctl disable --now myservice
sudo rm /etc/systemd/system/myservice.service
sudo rm -rf /opt/myservice
sudo systemctl daemon-reload
Quiz
Q1. Comment activer un service au démarrage ET le lancer immédiatement ?
Réponse
sudo systemctl enable --now service
Q2. Comment voir les logs d'un service en temps réel ?
Réponse
journalctl -u service -f
Q3. Où créer un fichier service personnalisé ?
Réponse
/etc/systemd/system/
🔝 Retour à la table des matières
Points clés à retenir
systemctlgère les services (start, stop, restart, status)enable= au boot,start= maintenantjournalctl -u service= logs du servicejournalctl -f= logs en temps réel- Services personnalisés dans
/etc/systemd/system/ - Toujours
daemon-reloadaprès modification systemctl statuspour diagnostiquer
🔝 Retour à la table des matières
← Chapitre précédent | Chapitre suivant : Variables d'environnement →