Aller au contenu principal

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