J'ai remarqué dans les répertoires avec beaucoup de fichiers sur NFS si je le fais
ls *
puis appuyez sur Ctrl-C, cela peut prendre un certain temps (disons 20 secondes) avant que ls ne revienne.
Pourquoi? La commande ls peut-elle être corrigée pour être plus réactive ?
Réponse acceptée :
Lorsque vous exécutez ls *
, la première chose qui se passe est que le shell obtient une liste du répertoire courant. Si le répertoire est énorme et que le serveur est lent, cela peut prendre un certain temps.
Une fois que le shell a obtenu la liste des noms de fichiers dans le répertoire courant, il trie cette liste (ce qui est très rapide par rapport à n'importe quelle interaction réseau), puis appelle ls
. Le ls
recherche tour à tour chaque fichier et récupère ses métadonnées (stat
appel) pour vérifier s'il s'agit d'un répertoire ; si un fichier est un répertoire, ls
répertorie son contenu plutôt que le répertoire lui-même.
Lorsque vous appuyez sur Ctrl +C , cela n'interrompra pas l'opération NFS en cours. Vous ne pouvez pas interrompre une opération de système de fichiers n'importe où, car cela pourrait laisser le système dans un état incohérent. Même la lecture d'un fichier peut mettre à jour son temps d'accès. La plupart du temps, une opération élémentaire de lecture ou d'écriture sur un fichier est instantanée selon les normes humaines, mais NFS est une exception, en particulier avec de grandes quantités de données sur un réseau lent.
Ainsi, en appuyant sur Ctrl +C ne prendra effet que :
- si le shell génère actuellement la liste des noms de fichiers, lorsque cette liste est entièrement récupérée ;
- si
ls
a été démarré et est en train d'obtenir des métadonnées sur un fichier, lorsque le serveur fournit les métadonnées ; - si
ls
a été démarré et répertorie actuellement un répertoire, lorsque la liste est entièrement récupérée, ou au moins après une partie de celle-ci.
Ce n'est pas la faute du ls
commande (qui n'a peut-être même pas encore été démarrée). Ce n'est même pas la faute du shell :c'est la faute de NFS. NFS est assez lent.