Contrôler les services systemd et écrire des fichiers d’unité
Pilotez les services avec systemctl et rédigez des fichiers d’unité et de temporisation personnalisés pour des démons scriptés.
Contrôler les services systemd et écrire des fichiers d’unité est une leçon Linux Command Line & Bash Scripting Mastery gratuite sur CoddyKit. Ceci est la leçon 2 sur 4. Tu peux lire la leçon complète ci-dessous gratuitement — puis la pratiquer en direct dans le navigateur avec un éditeur de code intégré et un tuteur IA 24/7. Elle fait partie du parcours d'apprentissage Linux Command Line & Bash Scripting Mastery, et ta progression se synchronise sur le web et l'application CoddyKit. Le cours Linux Command Line & Bash Scripting Mastery comprend 4 leçons au total.
Introduction à systemd et systemctl
systemd est le système d'initialisation et le gestionnaire de services utilisés par la plupart des distributions Linux modernes. Il est chargé de démarrer, d'arrêter et de gérer les services système, ainsi que de gérer les séquences de démarrage et l'état du système.
L'outil principal pour interagir avec systemd est systemctl. Il vous permet de :
- Démarrer et arrêter des services
- Activer ou désactiver des services au démarrage
- Examiner l'état et les journaux des services
- Recharger la configuration sans redémarrer
Tous les services gérés par systemd sont définis par des fichiers d'unité, c'est-à-dire des fichiers de configuration déclarative stockés dans /etc/systemd/system/ (à l'échelle du système) ou dans ~/.config/systemd/user/ (par utilisateur).
Commandes essentielles de systemctl
Voici les commandes systemctl les plus utilisées pour gérer les services au quotidien. Chaque commande agit sur un nom d’unité, tel que nginx.service ou simplement nginx.
systemctl start <unit>— démarrer immédiatement un servicesystemctl stop <unit>— arrêter un service en cours d’exécutionsystemctl restart <unit>— arrêter puis démarrer le service (redémarrage complet)systemctl reload <unit>— envoyer SIGHUP pour recharger la configuration sans arrêter le servicesystemctl enable <unit>— créer des liens symboliques afin que l’unité démarre au démarrage du systèmesystemctl disable <unit>— supprimer ces liens symboliquessystemctl status <unit>— afficher l’état, le PID et les dernières lignes du journal
#!/usr/bin/env bash
# Quick reference: inspect and control an nginx service
# (Requires nginx to be installed; run as root or with sudo)
systemctl status nginx
systemctl start nginx
systemctl enable nginx
systemctl reload nginx
systemctl restart nginx
systemctl stop nginx
systemctl disable nginxVérifier en détail l’état d’un service
systemctl status fournit un instantané détaillé d’une unité. Comprendre sa sortie est essentiel pour diagnostiquer rapidement les problèmes.
- Loaded : chemin du fichier d’unité et indication de son activation au démarrage
- Active : état actuel —
active (running),inactive (dead),failed - Main PID : identifiant du processus principal du service
- CGroup : tous les processus enfants appartenant au service
- Log lines : les entrées les plus récentes du journal pour cette unité
Vous pouvez également interroger uniquement l’état d’activité avec systemctl is-active et l’état d’activation avec systemctl is-enabled ; ces commandes sont idéales pour les scripts.
#!/usr/bin/env bash
# Script-friendly service health check
SERVICE="sshd"
if systemctl is-active --quiet "$SERVICE"; then
echo "$SERVICE is running."
else
echo "$SERVICE is NOT running. Attempting restart..."
systemctl restart "$SERVICE"
fi
if systemctl is-enabled --quiet "$SERVICE"; then
echo "$SERVICE is enabled at boot."
else
echo "WARNING: $SERVICE is not enabled at boot."
fiRépertorier et filtrer les unités
Lorsque vous gérez de nombreux services, vous devez pouvoir répertorier et filtrer efficacement les unités. systemctl list-units affiche toutes les unités actuellement chargées, tandis que list-unit-files affiche tous les fichiers d’unité installés ainsi que leur état d’activation.
Options de filtrage utiles :
--type=service— afficher uniquement les unités de service--state=failed— afficher uniquement les unités en échec--state=active— afficher uniquement les unités actives--all— inclure les unités inactives dans la liste
Associer ces filtres à grep vous permet de créer des pipelines d’inspection puissants dans les scripts de maintenance.
#!/usr/bin/env bash
# List all failed services and report them
echo "=== Failed Services ==="
systemctl list-units --type=service --state=failed --no-legend
echo ""
echo "=== Services Enabled at Boot ==="
systemctl list-unit-files --type=service --state=enabled --no-legend | awk '{print $1}'Anatomie d’un fichier d’unité de service systemd
Un fichier d’unité de service est un fichier texte brut de style INI composé de sections. Chaque section contrôle un aspect différent du cycle de vie de l’unité.
- [Unité] — métadonnées : description et dépendances d’ordre (
After=,Requires=,Wants=) - [Service] — manière de démarrer et d’arrêter le processus :
ExecStart,ExecStop,Restart,User,WorkingDirectory - [Installation] — moment où cette unité doit être activée :
WantedBy=multi-user.targetsignifie qu’elle est activée lors du démarrage normal en mode multi-utilisateur
Après avoir placé ou modifié un fichier d’unité sous /etc/systemd/system/, vous devez exécuter systemctl daemon-reload afin que systemd prenne en compte les changements.
Écrire votre premier fichier d’unité de service
Créons un fichier d’unité de service simple pour un script de serveur HTTP personnalisé en Python. Le fichier d’unité indique précisément à systemd comment gérer ce processus, comme s’il s’agissait de n’importe quel autre service système.
Directives [Service] principales utilisées ici :
Type=simple— systemd considère le processusExecStartcomme le processus principalUser=www-data— exécuter le processus sous un compte qui n’est pas root, pour renforcer la sécuritéWorkingDirectory— définir le répertoire de travail du processusRestart=on-failure— redémarrer automatiquement le processus s’il se termine avec un code différent de zéroRestartSec=5— attendre 5 secondes entre les tentatives de redémarrage
#!/usr/bin/env bash
# Create a custom service unit file for a simple HTTP server
# Run as root
cat > /etc/systemd/system/mywebserver.service << 'EOF'
[Unit]
Description=My Custom Python Web Server
After=network.target
[Service]
Type=simple
User=www-data
WorkingDirectory=/var/www/mysite
ExecStart=/usr/bin/python3 -m http.server 8080
Restart=on-failure
RestartSec=5
StandardOutput=journal
StandardError=journal
[Install]
WantedBy=multi-user.target
EOF
systemctl daemon-reload
systemctl enable --now mywebserver.service
systemctl status mywebserver.serviceTypes de services et cycle de vie des processus
La directive Type= dans [Service] indique à systemd comment déterminer qu’un service a terminé son démarrage. Choisir le mauvais type est une source fréquente de problèmes d’ordre de démarrage.
Type=simple— type par défaut ; systemd considère que le service a démarré dès le lancement deExecStart. Aucun signal de disponibilité n’est nécessaire.Type=forking— le processusExecStartcrée un processus enfant puis se termine ; le véritable démon s’exécute en tant que processus enfant. UtilisezPIDFile=pour que systemd puisse le suivre.Type=notify— le processus envoiesd_notify(READY=1)lorsqu’il est réellement prêt. C’est le type le plus fiable pour les démons complexes.Type=oneshot— s’exécute une fois puis se termine ; les unités suivantes attendent la fin de son exécution. Idéal pour les scripts de configuration.Type=idle— similaire à simple, mais l’exécution est retardée jusqu’à la fin de toutes les tâches actives.
#!/usr/bin/env bash
# Example: oneshot service for a database migration script
# /etc/systemd/system/db-migrate.service
cat > /etc/systemd/system/db-migrate.service << 'EOF'
[Unit]
Description=Run Database Migrations
After=postgresql.service
Requires=postgresql.service
[Service]
Type=oneshot
User=appuser
WorkingDirectory=/opt/myapp
ExecStart=/opt/myapp/scripts/migrate.sh
RemainAfterExit=yes
[Install]
WantedBy=multi-user.target
EOF
systemctl daemon-reload
systemctl start db-migrate.serviceVariables d’environnement et renforcement de la sécurité
Les fichiers d’unité de service prennent en charge plusieurs directives permettant de transmettre des variables d’environnement et d’appliquer des restrictions de sécurité — ces deux aspects sont importants dans les systèmes de production.
Directives d’environnement :
Environment="KEY=value"— définir une seule variable directementEnvironmentFile=/etc/myapp/env— charger des variables depuis un fichier (une paireKEY=valuepar ligne)
Directives courantes de renforcement de la sécurité :
NoNewPrivileges=true— empêcher le processus d’obtenir des privilèges supplémentaires via setuidProtectSystem=strict— monter/usr,/bootet/etcen lecture seulePrivateTmp=true— fournir au service son propre/tmpisoléCapabilityBoundingSet=— supprimer toutes les capacités Linux
#!/usr/bin/env bash
# Hardened service unit with environment file
cat > /etc/systemd/system/secureapp.service << 'EOF'
[Unit]
Description=Secure Application Daemon
After=network.target
[Service]
Type=simple
User=secureapp
Group=secureapp
WorkingDirectory=/opt/secureapp
EnvironmentFile=/etc/secureapp/env
ExecStart=/opt/secureapp/bin/server
Restart=on-failure
RestartSec=10
# Security hardening
NoNewPrivileges=true
ProtectSystem=strict
ProtectHome=true
PrivateTmp=true
CapabilityBoundingSet=
ReadWritePaths=/var/lib/secureapp /var/log/secureapp
[Install]
WantedBy=multi-user.target
EOF
# Create the environment file separately so secrets stay out of the unit file
install -m 600 -o secureapp /dev/null /etc/secureapp/env
echo 'APP_PORT=9000' >> /etc/secureapp/env
echo 'DB_URL=postgresql://localhost/mydb' >> /etc/secureapp/env
systemctl daemon-reloadIntroduction aux unités de temporisation systemd
Une temporisation systemd est une unité qui active une autre unité (généralement un .service) selon un calendrier. Elle remplace les tâches cron traditionnelles par un mécanisme plus intégré, permettant la journalisation et le contrôle.
Chaque unité de temporisation (foo.timer) est associée à une unité de service portant le même nom de base (foo.service) qui effectue réellement le travail. Vous activez et démarrez la temporisation, et non le service directement.
Types de temporisation :
- Temporisations en temps réel (calendrier) — se déclenchent à des heures précises en utilisant des expressions
OnCalendar=telles quedaily,weeklyouMon *-*-* 02:00:00 - Temporisations monotones — se déclenchent par rapport à un événement système en utilisant
OnBootSec=,OnActiveSec=ouOnUnitActiveSec=
Écrire un fichier d’unité de temporisation
Construisons une paire complète temporisation + service qui exécute chaque jour à 02:00 un script de sauvegarde. Remarquez que la section [Timer] se trouve dans son propre fichier .timer, tandis que le travail est défini dans le fichier .service associé.
Directives [Timer] principales :
OnCalendar=— expression de calendrier définissant le programme d’exécutionPersistent=true— si le système était éteint au moment prévu du déclenchement, exécuter la tâche immédiatement au prochain démarrageRandomizedDelaySec=— ajouter un décalage aléatoire pouvant atteindre N secondes afin d’éviter un afflux simultané lorsque de nombreux hôtes partagent le même calendrierUnit=— unité cible explicite (facultative si les noms correspondent)
#!/usr/bin/env bash
# Create a daily backup timer pair
# Run as root
# 1. The service that does the work
cat > /etc/systemd/system/daily-backup.service << 'EOF'
[Unit]
Description=Daily Database Backup
After=network.target postgresql.service
[Service]
Type=oneshot
User=backup
ExecStart=/usr/local/bin/backup-db.sh
StandardOutput=journal
StandardError=journal
EOF
# 2. The timer that schedules it
cat > /etc/systemd/system/daily-backup.timer << 'EOF'
[Unit]
Description=Run Daily Database Backup at 02:00
[Timer]
OnCalendar=*-*-* 02:00:00
Persistent=true
RandomizedDelaySec=300
[Install]
WantedBy=timers.target
EOF
systemctl daemon-reload
systemctl enable --now daily-backup.timer
# Verify
systemctl list-timers daily-backup.timerExaminer les journaux et résoudre les problèmes des unités
systemd achemine toute la sortie des services vers le journal, que vous pouvez interroger avec journalctl. Cela centralise les journaux de toutes les unités dans un espace de stockage interrogeable.
Options essentielles de journalctl pour diagnostiquer les services :
-u <unit>— filtrer selon le nom de l’unité-f— suivre le journal en temps réel (comme avectail -f)-n 50— afficher uniquement les 50 dernières lignes--since "1 hour ago"— limiter les résultats selon l’heure-p err— afficher uniquement les erreurs et les priorités supérieures-b— afficher uniquement les journaux du démarrage actuel
Lorsqu’une unité ne parvient pas à démarrer, exécutez d’abord journalctl -u <unit> -n 30 --no-pager, puis systemctl status <unit> afin d’obtenir le contexte des erreurs récentes.
#!/usr/bin/env bash
# Troubleshooting helper: dump unit status and recent logs
# Usage: ./service-debug.sh <unit-name>
UNIT="${1:-nginx.service}"
echo "=============================="
echo "STATUS: $UNIT"
echo "=============================="
systemctl status "$UNIT" --no-pager -l
echo ""
echo "=============================="
echo "RECENT LOGS (last 50 lines): $UNIT"
echo "=============================="
journalctl -u "$UNIT" -n 50 --no-pager
echo ""
echo "=============================="
echo "ERRORS ONLY (current boot)"
echo "=============================="
journalctl -u "$UNIT" -b -p err --no-pagerVérification des connaissances : fichiers d’unité systemd
Vérifiez votre compréhension de la configuration des unités de service et de temporisation systemd.
Récapitulatif de la leçon : contrôler les services systemd et écrire des fichiers d’unité
Dans cette leçon, vous avez étudié les concepts fondamentaux de la gestion des services systemd et de la rédaction de fichiers d’unité à un niveau professionnel. Voici un résumé des points abordés :
- Principes de base de systemctl — démarrer, arrêter, redémarrer, recharger, activer, désactiver et vérifier l’état avec start, stop, restart, reload, enable, disable, status, is-active et is-enabled, pour des vérifications adaptées aux scripts
- Répertorier et filtrer — utiliser
list-unitsetlist-unit-filesavec les options--typeet--statepour isoler les services en échec ou activés - Anatomie d’un fichier d’unité — les trois sections
[Unit],[Service]et[Install], ainsi que leurs directives principales - Types de services —
simple,forking,notify,oneshotet situations adaptées à chacun - Environnement et sécurité —
EnvironmentFile,NoNewPrivileges,ProtectSystemetPrivateTmppour les démons renforcés - Unités de temporisation — associer les fichiers
.timeret.service, utiliser les expressionsOnCalendaret le rattrapage prévu parPersistent - Journalctl — filtrer selon l’unité, l’heure, le démarrage et la priorité afin de diagnostiquer efficacement les défaillances
Grâce à ces compétences, vous pouvez gérer n’importe quel service système, planifier de manière fiable des tâches récurrentes et rédiger des fichiers d’unité prêts pour la production pour vos propres démons.
Questions Fréquemment Posées
La leçon « Contrôler les services systemd et écrire des fichiers d’unité » est-elle gratuite ?
Oui — le texte complet de « Contrôler les services systemd et écrire des fichiers d’unité » est gratuit à lire ici sur le web. Pour la pratiquer de manière interactive (un éditeur de code intégré et un tuteur IA 24/7) et déverrouiller le reste du cours Linux Command Line & Bash Scripting Mastery, passe à CoddyKit PRO. Le cours Linux Command Line & Bash Scripting Mastery comprend 4 leçons au total.
Qu'est-ce que j'apprendrai dans « Contrôler les services systemd et écrire des fichiers d’unité » ?
Pilotez les services avec systemctl et rédigez des fichiers d’unité et de temporisation personnalisés pour des démons scriptés. Tu pratiques Linux Command Line & Bash Scripting Mastery avec du code pratique que tu exécutes directement dans le navigateur, et un tuteur IA 24/7 répond à tes questions au fur et à mesure que tu avances dans la leçon.
Dois-je avoir de l'expérience pour commencer Linux Command Line & Bash Scripting Mastery ?
Aucune expérience préalable n'est requise. Linux Command Line & Bash Scripting Mastery sur CoddyKit est structuré pour les débutants jusqu'aux apprenants avancés, donc tu peux commencer ici ou depuis le début et avancer à ton rythme. Ceci est la leçon 2 sur 4.
Combien de temps prend la leçon « Contrôler les services systemd et écrire des fichiers d’unité » ?
La plupart des leçons CoddyKit prennent environ 5–10 minutes. Chacune est courte et interactive, tu progresses régulièrement et tu repiques exactement où tu t'es arrêté sur le web et l'app.
Peux-tu écrire et exécuter du code dans cette leçon Linux Command Line & Bash Scripting Mastery ?
Oui. Chaque leçon Linux Command Line & Bash Scripting Mastery inclut un éditeur de code intégré, tu écris et exécutes du vrai code directement dans ton navigateur et tu reçois des retours IA instantanés — aucune configuration locale requise.
Toutes les leçons de ce cours
- Automatiser la création d’utilisateurs et de groupes
- Contrôler les services systemd et écrire des fichiers d’unité
- Automatiser les disques, systèmes de fichiers et montages
- Créer des scripts de contrôle d’état et d’alerte du système