Chapitre 8.2 - Services Personnalisés
Objectifs d'Apprentissage
À la fin de ce chapitre, vous serez capable de:
- Créer un fichier unit systemd
- Configurer un service personnalisé
- Comprendre les sections d'un unit file
- Gérer les dépendances
- Créer des services pour scripts
Structure d'un Unit File
Emplacement
# Système
/etc/systemd/system/
# Utilisateur
~/.config/systemd/user/
Priorité:
/etc/systemd/system/(système) >/usr/lib/systemd/system/(paquets)
Format de Base
[Unit]
Description=Description du service
After=network.target
[Service]
Type=simple
ExecStart=/chemin/vers/commande
Restart=always
[Install]
WantedBy=multi-user.target
Sections Principales
[Unit]
[Unit]
Description=Mon Service Personnalisé
Documentation=man:mon-service(1)
After=network.target sshd.service
Before=some-service.service
Requires=network.target
Wants=sshd.service
Conflicts=old-service.service
Directives:
- Description: Description du service
- After: Démarre après ces unités
- Before: Démarre avant ces unités
- Requires: Dépendance forte (échec si dépendance échoue)
- Wants: Dépendance faible (continue si dépendance échoue)
- Conflicts: Ne peut pas tourner en même temps
[Service]
[Service]
Type=simple
ExecStart=/usr/local/bin/mon-script.sh
ExecStartPre=/bin/echo "Démarrage"
ExecStartPost=/bin/echo "Démarré"
ExecStop=/bin/echo "Arrêt"
ExecReload=/bin/kill -HUP $MAINPID
Restart=always
RestartSec=10
User=monuser
Group=mongroup
WorkingDirectory=/var/lib/monservice
Environment="VAR1=valeur1"
EnvironmentFile=/etc/monservice/env
StandardOutput=journal
StandardError=journal
Types:
- simple: Commande principale (défaut)
- forking: Fork en arrière-plan
- oneshot: Exécution unique
- notify: Notifie systemd quand prêt
Restart:
- no: Ne redémarre pas
- always: Toujours redémarrer
- on-failure: Redémarrer si échec
- on-success: Redémarrer si succès
[Install]
[Install]
WantedBy=multi-user.target
Alias=monservice.service
Targets courants:
- multi-user.target: Mode multi-utilisateurs
- graphical.target: Mode graphique
- default.target: Target par défaut
Exemples Pratiques
Service Simple
# /etc/systemd/system/mon-service.service
[Unit]
Description=Mon Service Simple
After=network.target
[Service]
Type=simple
ExecStart=/usr/local/bin/mon-script.sh
Restart=always
RestartSec=10
User=www-data
StandardOutput=journal
StandardError=journal
[Install]
WantedBy=multi-user.target
Activer:
sudo systemctl daemon-reload
sudo systemctl enable mon-service
sudo systemctl start mon-service
Service avec Script
#!/bin/bash
# /usr/local/bin/mon-script.sh
# Script de service
# Fonction de nettoyage
cleanup() {
echo "Arrêt du service"
# Nettoyage...
exit 0
}
# Trap signals
trap cleanup SIGTERM SIGINT
# Boucle principale
while true; do
# Travail...
echo "Service actif: $(date)"
sleep 60
done
Unit file:
[Unit]
Description=Service avec Script
After=network.target
[Service]
Type=simple
ExecStart=/usr/local/bin/mon-script.sh
Restart=always
RestartSec=5
StandardOutput=journal
StandardError=journal
[Install]
WantedBy=multi-user.target
Service Forking
[Unit]
Description=Service Forking
After=network.target
[Service]
Type=forking
ExecStart=/usr/local/bin/daemon --daemonize
PIDFile=/var/run/daemon.pid
Restart=always
[Install]
WantedBy=multi-user.target
Service Oneshot
[Unit]
Description=Script Oneshot
After=network.target
[Service]
Type=oneshot
ExecStart=/usr/local/bin/init-script.sh
RemainAfterExit=yes
[Install]
WantedBy=multi-user.target
Variables d'Environnement
Dans Unit File
[Service]
Environment="VAR1=valeur1"
Environment="VAR2=valeur2"
EnvironmentFile=/etc/monservice/env
Fichier d'Environnement
# /etc/monservice/env
VAR1=valeur1
VAR2=valeur2
VAR3="valeur avec espaces"
Gestion des Logs
Journal systemd
# Voir logs service
sudo journalctl -u mon-service
# Suivre logs
sudo journalctl -u mon-service -f
# Logs récents
sudo journalctl -u mon-service -n 50
# Depuis date
sudo journalctl -u mon-service --since "2024-01-01"
Redirection
[Service]
# Vers journal (défaut)
StandardOutput=journal
StandardError=journal
# Vers fichier
StandardOutput=file:/var/log/monservice.log
StandardError=file:/var/log/monservice-error.log
# Ignorer
StandardOutput=null
StandardError=null
Bonnes Pratiques
Structure
[Unit]
# Description claire
# Dépendances appropriées
[Service]
# Type correct
# User/Group non-root si possible
# Restart approprié
# Logging configuré
[Install]
# Target approprié
Sécurité
[Service]
# Ne pas utiliser root si possible
User=serviceuser
Group=servicegroup
# Limiter capacités
CapabilityBoundingSet=CAP_NET_BIND_SERVICE
NoNewPrivileges=true
# Chroot si possible
RootDirectory=/var/lib/monservice
Résumé
Dans ce chapitre, vous avez appris:
Unit files: Structure [Unit], [Service], [Install]
Types: simple, forking, oneshot, notify
Dépendances: After, Before, Requires, Wants
Restart: always, on-failure, never
Environnement: Environment, EnvironmentFile
Logs: journalctl, redirection fichiers
Pratique: Créer services pour scripts et applications
Prochaines Étapes
Chapitre 8.3: Cron Avancé et systemd Timers
Module 9: Sécurité Système
Chapitre créé le: Décembre 2024