trap en bash : nettoyer proprement un script interrompu
Un script tué en pleine exécution laisse un lockfile derrière lui, sauf si trap intercepte le signal avant. SIGKILL reste impossible à intercepter, quel que soit le trap défini.
Sous chaque conteneur il y a un noyau, et la plupart des surprises de production viennent de là. Ce parcours couvre ce qui reste vrai quel que soit l'orchestrateur.
26 articles · 5 sections
Ce qui tue un processus, ce qui ne le tue pas, et pourquoi.
Un script tué en pleine exécution laisse un lockfile derrière lui, sauf si trap intercepte le signal avant. SIGKILL reste impossible à intercepter, quel que soit le trap défini.
Une commande lancée avec & tourne en arrière-plan mais meurt quand même à la fermeture du terminal : le shell envoie SIGHUP à ses enfants. nohup et disown évitent ça.
Un processus zombie est déjà mort. Lui envoyer SIGKILL ne fait rien : la vraie cause est un parent qui n'a jamais récupéré son code de sortie.
Droits, liens, montages — les pièges qui survivent aux décennies.
Un périphérique listé dans fstab mais absent au boot peut bloquer tout le démarrage. L'option nofail existe pour ça.
Un hard link partage le même inode que l'original, un symlink pointe vers un chemin. C'est pourquoi l'un survit à la suppression de l'original, l'autre non.
Le bit setuid marche sur un binaire compilé mais le kernel l'ignore silencieusement sur un script shell, protection délibérée contre une classe de faille connue.
Écrire dans un répertoire suffit à y supprimer n'importe quel fichier, même d'un autre utilisateur. Le sticky bit sur /tmp casse délibérément cette règle par défaut.
/tmp n'est pas nettoyé qu'au reboot : systemd-tmpfiles-clean tourne périodiquement et supprime les fichiers dépassant un âge configuré, reboot ou pas.
Un script fonctionne bien à la main mais crée des fichiers aux permissions différentes lancé par cron. Le coupable est presque toujours un umask différent, pas le script.
No space left on device alors que df -h affiche 40% de libre : ce n'est jamais l'espace disque qui manque, ce sont les inodes, une ressource distincte et finie.
Ce que systemd garantit au démarrage, et ce qu’il ne garantit pas.
Un crash sans core dump n'est pas un mystère : ulimit -c vaut 0 par défaut, et systemd ignore souvent /etc/security/limits.conf pour cette limite.
Une tâche cron qui échoue ne le dit à personne par défaut. Un systemd timer hérite du Restart et de l'historique journalctl du service qu'il déclenche.
Restart=on-failure ne suffit pas à empêcher un service de boucler indéfiniment. StartLimitBurst est le vrai coupe-circuit, souvent jamais réglé.
Augmenter ulimit -n dans limits.conf ne change rien pour un service systemd : LimitNOFILE= dans l'unité prime totalement sur les limites PAM classiques.
Pression mémoire, OOM killer, swap : la zone où l’intuition trompe.
Ajouter du swap aggrave parfois la situation : un système qui thrashe devient inutilisable, souvent pire qu'un processus tué proprement et vite par l'OOM killer.
Ce qu’un sysadmin fait tous les jours et qui n’est écrit nulle part.
Un serveur dont l'horloge dérive de quelques minutes rejette silencieusement des certificats TLS valides. chronyc tracking révèle en une commande ce que personne ne surveille.
cloud-init ne s'exécute qu'une fois par instance, un état tracké localement. Cloner une VM sans l'effacer fait croire à cloud-init qu'il a déjà tourné, clés SSH dupliquées à la clé.
Could not get lock pousse à supprimer le verrou directement. Vérifier quel processus le détient d'abord évite une base de paquets corrompue.
df continue d'afficher l'ancienne taille après un lvextend réussi : agrandir un volume logique LVM ne redimensionne jamais automatiquement le système de fichiers qu'il contient.
Une résolution de nom incohérente entre deux machines pointe souvent vers nsswitch.conf, pas vers le DNS : il définit l'ordre des sources pour hosts, passwd et group.
chmod et chown corrects, et pourtant Permission denied persiste. SELinux applique un second système de permissions : le contexte de sécurité, indépendant des droits Unix.
Éditer /etc/sudoers directement risque une erreur de syntaxe qui casse sudo pour tout le monde, y compris pour la corriger. visudo valide avant d'écrire.
nftables est le défaut depuis des années, mais une couche de compatibilité fait tourner les anciennes règles iptables sans jamais forcer leur migration.
Un disque qui se remplit sans qu'aucun fichier visible ne l'explique cache souvent un log renommé par rotation, mais toujours ouvert par un processus qui écrit dans le vide.
set -e n'arrête jamais un script à l'intérieur d'un if ni d'une condition &&. Comprendre les trois options séparément évite le faux sentiment de sécurité.
Une table conntrack pleine ne ralentit rien : elle rejette silencieusement les nouvelles connexions, un symptôme qui ressemble à un problème applicatif ailleurs.