Mise à jour atomique sous Linux : déployer un script sans interrompre cron ou systemd
Déployez scripts et configurations Linux sans fichier incomplet : mv atomique, liens symboliques, vérifications et retour arrière rapide.
Ne remplacez pas directement un script appelé par cron ou systemd. Préparez et validez un fichier temporaire sur le même système de fichiers, puis publiez-le avec mv : un nouveau lecteur verra l’ancienne version ou la nouvelle, pas un fichier à moitié écrit.
Cette précaution évite qu’un lancement tombe pendant une redirection ou une copie et lise un script incomplet. Elle ne corrige pas une configuration complète mais invalide, ni un processus qui a déjà chargé l’ancienne version.
Remplacer un script
Créez le fichier temporaire dans le répertoire de la cible, appliquez ses droits et exécutez les contrôles avant le renommage. Sur un même système de fichiers, le renommage remplace le nom de destination en une opération visible par les lecteurs ; la documentation de GNU mv précise le comportement des déplacements entre systèmes de fichiers.
target=/usr/local/sbin/import-clients
tmp=$(mktemp "${target}.tmp.XXXXXX")
trap 'rm -f -- "$tmp"' EXIT
cp -- ./import-clients "$tmp"
chmod 0755 "$tmp"
bash -n "$tmp" || exit 1
mv -f -- "$tmp" "$target"
trap - EXIT
Dans cet exemple, le script existant reste intact si la copie ou la vérification échoue. Adaptez le contrôle au fichier : systemd-analyze verify pour une unité systemd, ou généralement nginx -t pour une configuration Nginx.
Publier une release complète
Si le déploiement comprend plusieurs scripts, une configuration et des données associées, ne les remplacez pas un par un : les versions pourraient être mélangées pendant l’opération. Préparez plutôt chaque version dans son propre répertoire et faites pointer un lien current vers la release active.
/opt/import/releases/2026-10-14-1/import-clients
/opt/import/releases/2026-10-14-1/import.conf
/opt/import/current -> /opt/import/releases/2026-10-14-1
Configurez cron ou systemd avec le chemin stable /opt/import/current/import-clients. Après avoir contrôlé la nouvelle release, créez un lien temporaire puis renommez-le sur current.
cd /opt/import
ln -s releases/2026-10-14-2 current.next
mv -Tf current.next current
L’option -T de GNU mv traite current comme un nom de fichier, même si ce lien désigne un répertoire. Le retour arrière suit le même principe : créez un lien temporaire vers la release précédente, puis renommez-le sur current.
Vérifier le déploiement
Avant le basculement, vérifiez la syntaxe, les droits, le propriétaire et, si possible, l’exécution avec un jeu de données de test ou une option de vérification. Utilisez stat ou namei pour contrôler les permissions du chemin complet.
Après une modification d’unité systemd, exécutez systemctl daemon-reload, puis consultez systemctl status nom.service et journalctl. Pour une tâche planifiée, vérifiez l’exécution suivante dans les journaux ; pour les jobs courts lancés par cron ou par un timer systemd, le modèle release + lien current permet à chaque lancement d’utiliser une version cohérente.