Aller au contenu principal

Services et systemd


Table des matières

  1. Introduction à systemd
  2. systemctl : commandes essentielles
  3. Activer/désactiver au démarrage
  4. Journaux avec journalctl
  5. Créer un service simple
  6. 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

TermeDescription
UnitRessource gérée par systemd
ServiceUn type d'unit (démon)
TargetGroupe d'units (ex: multi-user.target)
SocketCommunication inter-processus
TimerÉquivalent moderne de cron

Types d'units

ExtensionType
.serviceServices/démons
.socketSockets
.targetGroupes d'units
.timerTâches planifiées
.mountPoints de montage
.devicePériphériques

Emplacement des fichiers

CheminDescription
/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

CommandeDescription
systemctl startDémarrer un service
systemctl stopArrêter un service
systemctl restartRedémarrer
systemctl reloadRecharger la configuration
systemctl statusVoir 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

ActionEffet
enableDémarre automatiquement au boot
disableNe démarre pas au boot
startDémarre maintenant
stopArrête maintenant
remarque

enablestart ! 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é

NiveauSignification
0emerg
1alert
2crit
3err
4warning
5notice
6info
7debug
# 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

SectionContenu
[Unit]Métadonnées, dépendances
[Service]Configuration du service
[Install]Quand activer le service

Options courantes

[Unit]

OptionDescription
DescriptionDescription du service
AfterDémarrer après ces units
RequiresDépendances obligatoires
WantsDépendances optionnelles

[Service]

OptionDescription
Typesimple, forking, oneshot...
ExecStartCommande de démarrage
ExecStopCommande d'arrêt
ExecReloadCommande de rechargement
UserUtilisateur d'exécution
WorkingDirectoryRépertoire de travail
Restartalways, on-failure, no
RestartSecDélai avant redémarrage
EnvironmentVariables 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

  • systemctl gère les services (start, stop, restart, status)
  • enable = au boot, start = maintenant
  • journalctl -u service = logs du service
  • journalctl -f = logs en temps réel
  • Services personnalisés dans /etc/systemd/system/
  • Toujours daemon-reload après modification
  • systemctl status pour diagnostiquer

🔝 Retour à la table des matières


← Chapitre précédent | Chapitre suivant : Variables d'environnement →