Fini le disque RAM saturé par les fichiers temporaires de session : terminal.temp_dir et le nettoyage automatique de 72 heures


C’est samedi soir et vous avez laissé Hermes exécuter un job par lots : des processus en arrière-plan qui écrivent des logs, un sandbox d’exécution de code qui déborde de résultats intermédiaires, plusieurs appels d’outils qui écrivent temporairement sur le disque. Vous vous réveillez à 3 h du matin avec une alerte « disque plein » — et le coupable n’est pas votre répertoire de projet, c’est /tmp, ce répertoire auquel vous ne pensez jamais. Ce n’est pas un cas limite : de nombreuses distributions (les Arch notamment) montent /tmp en tmpfs sur la RAM, avec une capacité qui ne représente qu’une fraction de votre mémoire physique. Dès qu’Hermes lance quelques processus en arrière-plan, ce disque RAM se remplit — puis viennent les échecs d’écriture mystérieux, les processus qui plantent et les tâches abandonnées. Le correctif fusionné le 28 août (PR #97205) règle tout cela d’un coup : les fichiers temporaires de session vont désormais par défaut sur le vrai disque, et une clé de config permet de les relocaliser quand vous le souhaitez.

La cause racine : des fichiers temporaires sur un tmpfs

Hermes produit une série d’« artefacts temporaires de session » pendant qu’il travaille : les fichiers log/pid/exit des processus en arrière-plan (le triplet hermes_bg_*), les sandbox d’exécution de code, et les résultats d’outils écrits sur le disque. Avant ce changement, ces fichiers allaient par défaut dans /tmp.

Sur de nombreuses distributions Linux, /tmp n’est pas un vrai répertoire de disque — c’est un tmpfs : les données vivent dans la RAM, les lectures et écritures sont rapides, mais la capacité est faible (typiquement la moitié de la mémoire physique, voire moins) et tout disparaît au redémarrage. Quand Hermes chauffe, les processus en arrière-plan s’accumulent et le disque RAM se vide en quelques minutes. Pire, les échecs d’écriture échouent rarement vite — ils remontent en plein milieu d’une tâche, de façon déroutante.

La description du mainteneur est sans détour : « de nombreuses distributions (les Arch, et nos propres machines) montent /tmp en petit tmpfs adossé à la RAM, et Hermes le remplit sous charge. » Même les machines de l’équipe officielle sont concernées.

Le correctif : les fichiers temporaires vont par défaut sur du stockage réel

L’ordre de résolution après le changement est le suivant :

  1. La clé de config terminal.temp_dir (explicite, priorité maximale)
  2. Les variables d’environnement TMPDIR / TMP / TEMP
  3. ~/.hermes/cache/terminal (nouveau défaut)
  4. /tmp (dernier recours)

Sauf si vous configurez quelque chose, les fichiers temporaires de session atterrissent donc dans le répertoire de cache propre à Hermes — du stockage réel, la capacité n’est plus un problème. La branche Windows reflète le même défaut, le comportement est donc cohérent sur toutes les plateformes.

Nettoyage automatique de 72 heures

Le changement embarque aussi un pruner cleanup_terminal_temp_cache() : les fichiers temporaires de plus de 72 heures sont supprimés automatiquement. Il y a un détail soigné — le triplet hermes_bg_* (log / pid / exit) vieillit comme un groupe : le fichier .log tout frais d’un service d’arrière-plan encore actif « protège » ses fichiers .pid et .exit à l’apparence périmée d’une suppression. Ainsi, un service encore en cours ne perd jamais son fichier pid et ne devient pas introuvable.

Vous préférez un autre emplacement ? Deux options

Si vous voulez garder les fichiers temporaires de session ailleurs (un SSD dédié, un gros volume de données), choisissez l’une des deux options.

Option 1 : la clé de config terminal.temp_dir

# config.yaml
terminal:
  temp_dir: /var/hermes-tmp

Option 2 : la variable d’environnement TERMINAL_TEMP_DIR

export TERMINAL_TEMP_DIR=/var/hermes-tmp

La clé de config prime sur la variable d’environnement, et les deux priment sur le défaut. Une réserve : si vous pointez explicitement les fichiers temporaires quelque part, ce répertoire vous appartient — le nettoyage automatique ne s’applique qu’au défaut géré ~/.hermes/cache/terminal, jamais à votre emplacement personnalisé (le commentaire du code source est explicite : « les emplacements terminal.temp_dir définis par l’utilisateur lui appartiennent »).

Ce que cela change pour vous

  • Utilisateurs d’Arch / autres tmpfs : vous bénéficiez du changement immédiatement après la mise à jour — le défaut bascule déjà sur le vrai disque, aucune config nécessaire ;
  • Ceux qui veulent un contrôle fin : une clé de config et une variable d’environnement existent désormais, c’est vous qui décidez où vivent les fichiers temporaires ;
  • Ceux qui craignent l’accumulation de données : le nettoyage automatique de 72 heures avec vieillissement par groupe empêche les fichiers de s’empiler.

Le changement corrige aussi discrètement un problème de longue date : quand /tmp se remplissait, les sandbox lancés dans une session échouaient en silence — ces « échecs d’écriture mystérieux » sont désormais beaucoup plus rares. Si votre Hermes tourne encore sur une version plus ancienne, hermes update vers le dernier build contenant ce changement.

Pour aller plus loin