Le WordPress d'aujourd'hui, décodé pour les développeurs

Outils & workflow

Un trap Bash pour nettoyer un déploiement interrompu proprement

Un script interrompu en cours de route peut laisser un site dans un état intermédiaire si aucun nettoyage n'est prévu à l'arrêt. La commande qui garantit ce nettoyage même sur Ctrl-C.

Par WordPress Développement • 2 février 2023 • 4 min de lecture • Aucun commentaire
Un trap Bash pour nettoyer un déploiement interrompu proprement

trap 'nettoyer' EXIT INT TERM : cette seule ligne, placée en tête d’un script Bash de déploiement, a suffi à éliminer une catégorie entière d’incidents qui touchait un site laissé en mode maintenance après une interruption manuelle du script en cours d’exécution.

Un script de déploiement typique enchaîne plusieurs étapes : activation d’un fichier de maintenance, synchronisation des fichiers, exécution des migrations, désactivation du mode maintenance. Tant que le script va jusqu’au bout, tout se déroule comme prévu. Le problème apparaît quand quelqu’un interrompt le script en cours de route — un Ctrl-C pressé par erreur, une connexion SSH coupée, une tâche planifiée qui dépasse son délai et se fait tuer par le système. Dans tous ces cas, les étapes de nettoyage prévues en fin de script ne s’exécutent jamais, et le site reste bloqué en mode maintenance jusqu’à une intervention manuelle.

Ce que trap intercepte réellement

La commande intégrée trap de Bash associe une commande ou une fonction à un ou plusieurs signaux reçus par le script. Trois signaux couvrent la quasi-totalité des cas d’interruption d’un script de déploiement :

  • EXIT — un pseudo-signal déclenché à chaque sortie du script, qu’elle soit normale ou provoquée par une erreur
  • INT — le signal envoyé par Ctrl-C, c’est-à-dire une interruption manuelle depuis le terminal
  • TERM — le signal de terminaison standard, envoyé notamment par kill sans option ou par un système qui met fin à un processus dépassant son délai

En associant une fonction de nettoyage à ces trois signaux dès le début du script, cette fonction s’exécute quel que soit le chemin de sortie emprunté, y compris les chemins imprévus.

Un exemple concret de script de déploiement

#!/usr/bin/env bash
set -euo pipefail

MAINTENANCE_ACTIF=0

nettoyer() {
  if [ "$MAINTENANCE_ACTIF" -eq 1 ]; then
    echo "Nettoyage : désactivation du mode maintenance"
    wp maintenance-mode deactivate --path=/var/www/site
  fi
}

trap nettoyer EXIT INT TERM

wp maintenance-mode activate --path=/var/www/site
MAINTENANCE_ACTIF=1

rsync -avz --delete build/ /var/www/site/wp-content/themes/mon-theme/
wp core update-db --path=/var/www/site

MAINTENANCE_ACTIF=0
wp maintenance-mode deactivate --path=/var/www/site
L'essentiel à retenir : Un Ctrl-C en plein déploiement laisse souvent des fichiers temporaires orphelins ; trap intercepte les signaux d'arrêt pour exécuter un nettoyage garanti ; Le nettoyage tourne aussi bien sur un arrêt normal que sur une interruption

La variable MAINTENANCE_ACTIF permet à la fonction nettoyer de savoir si le mode maintenance était effectivement activé au moment de l’interruption, pour éviter une désactivation inutile si le script échoue avant même cette étape. Le combo avec set -euo pipefail garantit par ailleurs qu’une commande en échec interrompt le script immédiatement plutôt que de continuer sur un état incohérent, ce qui déclenche alors le trap EXIT au bon moment.

Pourquoi EXIT seul ne suffit pas toujours

Un piège fréquent consiste à ne déclarer le trap que sur EXIT, en pensant que ce pseudo-signal couvre tous les cas. C’est presque vrai, mais pas totalement : selon le comportement du shell et de certains outils intermédiaires, un signal reçu peut, dans de rares configurations, contourner le déclenchement du trap EXIT si celui-ci n’est pas explicitement associé aussi à INT et TERM. Déclarer les trois signaux ensemble, comme dans l’exemple ci-dessus, élimine toute ambiguïté et documente en même temps, pour quiconque relit le script, les cas d’interruption pris en compte.

Étendre le principe à d’autres ressources temporaires

Le même mécanisme s’applique à toute ressource qui doit être libérée quoi qu’il arrive : un fichier verrou créé en début de script, un répertoire temporaire de build, une connexion SSH tunnelée ouverte pour la durée du déploiement. La fonction de nettoyage peut accumuler plusieurs actions, chacune protégée par une vérification de son état préalable, sur le même modèle que la variable MAINTENANCE_ACTIF de l’exemple.

Ce que ce mécanisme ne résout pas

Un trap de nettoyage remet le site dans un état cohérent après une interruption, mais ne garantit pas que le déploiement lui-même soit allé à son terme : si l’interruption survient au milieu d’une synchronisation de fichiers, certains fichiers peuvent rester dans un état partiellement copié. La reprise d’un déploiement interrompu à mi-parcours reste une question distincte, qui suppose une méthode idempotente plutôt qu’un simple nettoyage de sortie.

En résumé

Une seule ligne de trap placée en tête d’un script de déploiement transforme une interruption accidentelle, jusque-là source d’un site bloqué en maintenance, en un événement sans conséquence visible. Le coût d’implémentation est minime comparé au temps perdu à chaque intervention manuelle de nettoyage, et le principe se généralise sans effort à tout script qui manipule un état temporaire devant être restauré quoi qu’il arrive.

Laisser un commentaire

Votre adresse e-mail ne sera pas publiée. Les champs obligatoires sont indiqués avec *

Partager :

À propos de l'auteur

WordPress Développement

Développeur WordPress, passionné par Elementor, le FSE et l’automatisation par IA.

Voir tous ses articles

Dans la même veine

À lire aussi