Pré-requis recommandé : avoir quelques bases en bash et connaître les permissions (
chmod,chown).But : comprendre comment fonctionne
systemdet savoir écrire son propre service.
Il est courant d’avoir des scripts bash à automatiser : surveiller un dossier, lancer un service, ou effectuer des tâches récurrentes.
Mais comment faire en sorte qu’ils :
journalctl ?⇒ La réponse : créer un service systemd.
Créez un petit script bash qui écrit la date dans un fichier à chaque lancement.
mkdir -p ~/tp-systemd
cd ~/tp-systemd
cat <<EOF > date_logger.sh
#!/bin/bash
echo "[\$(date)] Service lancé !" >> /tmp/date_service.log
EOF
chmod +x date_logger.sh
Créez maintenant un fichier myservice.service :
[Unit]
Description=Service de log de date
[Service]
ExecStart=/home/$USER/tp-systemd/date_logger.sh
[Install]
WantedBy=multi-user.target
Copiez-le dans /etc/systemd/system/ :
sudo cp myservice.service /etc/systemd/system/
Puis rechargez systemd :
sudo systemctl daemon-reload
Voici la section enrichie sur systemctl, formatée en Markdown, prête à être intégrée dans ton TP :
systemctlVous avez maintenant un script qui fonctionne manuellement. C’est bien, mais comment faire en sorte qu’il soit :
C’est là qu’intervient systemd, le gestionnaire de services moderne sur Linux, et sa commande associée systemctl.
systemctl ?systemctl est l’outil en ligne de commande utilisé pour interagir avec systemd. Il permet de :
| Action | Commande |
|---|---|
| Lister tous les services actifs | systemctl list-units --type=service |
| Démarrer un service | sudo systemctl start nomduservice |
| Arrêter un service | sudo systemctl stop nomduservice |
| Redémarrer un service | sudo systemctl restart nomduservice |
| Voir l’état d’un service | systemctl status nomduservice |
| Activer un service au démarrage | sudo systemctl enable nomduservice |
| Désactiver un service | sudo systemctl disable nomduservice |
| Voir les logs (journalctl) | journalctl -u nomduservice |
Une fois que vous aurez créé un service pour votre script, vous pourrez :
sudo systemctl start myservice
Puis vérifier que tout s’est bien passé :
systemctl status myservice
Et consulter les logs générés par le service :
journalctl -u myservice
enable ?enable permet de lier votre service à un "target" de démarrage (typiquement multi-user.target) pour qu’il soit automatiquement lancé à chaque démarrage.
sudo systemctl enable myservice
Et si vous ne voulez plus qu’il se lance automatiquement :
sudo systemctl disable myservice
Astuce : le fait d’activer un service ne le démarre pas tout de suite.
Pour le faire tourner immédiatement et qu’il démarre au boot, faites :
sudo systemctl start myservice
sudo systemctl enable myservice
Lancez le service :
sudo systemctl start myservice
Regardez les logs :
cat /tmp/date_service.log
Observez son statut :
sudo systemctl status myservice
Activez le service au boot :
sudo systemctl enable myservice
Pour tester si cela fonctionne, redémarrez votre machine virtuelle, puis vérifiez le fichier
/tmp/date_service.log.
Créez un nouveau service nommé hello-service qui :
/tmp/hello.logAjoutez une temporisation (ex : sleep 5) dans le script pour observer un délai de démarrage.
Modifiez votre service pour expérimenter :
Type=oneshot vs Type=simpleRestart=alwaysEnvironment=Script hello.sh :
#!/bin/bash
echo "Bonjour systemd !" >> /tmp/hello.log
Service hello.service :
[Unit]
Description=Hello Systemd
[Service]
ExecStart=/home/YOUR_USER/tp-systemd/hello.sh
[Install]
WantedBy=multi-user.target
RestartSec=2: délai de 2 secondes avant de relancer le service.
Type=oneshot vs Type=simpleType=simple (comportement par défaut)Le service est actif tant que le script s’exécute. C’est le cas utilisé dans les exemples précédents.
Type=oneshotUtilisé pour les scripts ponctuels qui ne tournent qu’une fois et se terminent rapidement :
[Unit]
Description=Hello Systemd One-shot
[Service]
ExecStart=/home/YOUR_USER/tp-systemd/hello.sh
Type=oneshot
RemainAfterExit=yes
[Install]
WantedBy=multi-user.target
Ici,
/bin/bash -cest utilisé pour que la variable soit interprétée correctement dans la commande.
Crée un petit script qui échoue volontairement :
echo -e "#!/bin/bash\nexit 1" > ~/tp-systemd/crash.sh
chmod +x ~/tp-systemd/crash.sh
Puis un fichier service associé :
[Unit]
Description=Crash Test Service
[Service]
ExecStart=/home/YOUR_USER/tp-systemd/crash.sh
Restart=always
RestartSec=1
[Install]
WantedBy=multi-user.target
Lance et observe le comportement :
sudo systemctl start crash.service
sudo systemctl status crash.service
journalctl -u crash.service
Tu verras que le service échoue… puis redémarre en boucle automatiquement.