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 erreurINT— le signal envoyé parCtrl-C, c’est-à-dire une interruption manuelle depuis le terminalTERM— le signal de terminaison standard, envoyé notamment parkillsans 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

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.