Vendredi 23 novembre 2018 (Modifié le Vendredi 23 novembre 2018)

Afficher le contenu d’un répertoire en temps réel

Cet article est consacré à un problème agaçant et que j’ai vu apparaître de manière plus ou moins aléatoire sur toutes sortes de distributions Linux, indépendamment de l’environnement de bureau utilisé. Prenons un cas de figure concret pour décrire le problème en question.

  1. J’ouvre un navigateur de fichiers comme Dolphin, Thunar, Caja, etc.
  2. Je télécharge une archive compressée vers le répertoire courant.
  3. À première vue, le nouveau fichier n’apparaît pas dans la liste.
  4. J’appuie sur F5 pour rafraîchir l’affichage, et j’aperçois mon fichier.
  5. J’extrais l’archive vers le répertoire courant.
  6. Même problème, le contenu de l’archive n’apparaît pas.
  7. J’appuie encore sur F5 pour rafraîchir l’affichage, et le problème est réglé.

Il suffit de rafraîchir manuellement l’affichage du répertoire pour accéder aux nouveaux fichiers.

Après investigation, ce comportement est lié à inotify, un mécanisme du noyau Linux qui fournit des notifications concernant le système de fichiers.
La valeur max_user_watches définit la limite système du nombre de fichiers dont on surveille les changements en temps réel.
Sur les systèmes Red Hat Enterprise Linux et CentOS, cette valeur est trop basse.

# cat /proc/sys/fs/inotify/max_user_watches
8192

On peut augmenter cette valeur “à chaud”.

# sysctl fs.inotify.max_user_watches = 32768
# sysctl -p

Voir si cela a régle le problème d’affichage.

  1. J’ouvre le navigateur de fichiers Thunar.
  2. Je télécharge une archive compressée vers le répertoire courant.
  3. Le fichier s’affiche en temps réel.
  4. J’extrais l’archive vers le répertoire courant.
  5. Le répertoire résultant s’affiche directement.
  6. Le problème est résolu.

Rendre la modification persistante en créant un fichier /etc/sysctl.d/inotify.conf

# Monitor directories for change
fs.inotify.max_user_watches = 32768

Après avoir édité le fichier il faut recharger la configuration avec sysctl :

# sysctl --system