Pré-requis recommandé : avoir quelques bases en bash et connaître les permissions (
chmod
,chown
).But : comprendre comment fonctionne
systemd
et 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 :
systemctl
Vous 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.log
Ajoutez 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=simple
Restart=always
Environment=
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=simple
Type=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=oneshot
Utilisé 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 -c
est 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.