ls prend beaucoup de temps dans un petit répertoire

21

Sous Ubuntu, j'ouvre un terminal et fais

sudo bash
cd /
ls | head -n 1000

Et de manière prévisible, environ 20 répertoires sont renvoyés.

Cependant, si je fais un ls et que je ne le relie à rien, le ls se bloque jusqu'à ce que je le tue depuis un autre terminal. Que pourrait-il se passer?

ÉDITER:

> type ls
ls is aliased to `ls --color=auto`

ÉDITER:

> /bin/ls /
<normal response>
> /bin/ls --color=auto
<hangs indefinitely>

Pourquoi la coloration de la sortie de ls provoque-t-elle le blocage de cette commande?

Snitse
la source
3
Courez type lspour vérifier tous les alias possibles, etc.
jw013
5
L'exécution strace lspeut potentiellement vous aider à identifier le problème. straceaffiche tous les appels système effectués par le programme qu'il appelle.
Gowtham
2
Essayez /bin/ls(ou plutôt, command ls) d'exécuter lssans les options aliasées, pour confirmer si c'est l'option couleur qui fait la différence. FWIW, lsdésactive la coloration lorsque sa sortie est un tuyau ou un autre périphérique non terminal.
jw013
3
une barre oblique inverse avant qu'une commande ne l'exécute également à la place de l'alias. \ls
Rob

Réponses:

28

Si vous exécutez ls normalement, il affichera simplement la liste des fichiers sans avoir à exécuter stat (2) sur aucun d'entre eux. En d'autres termes, il n'accède pas aux FICHIERS eux-mêmes, mais uniquement au répertoire qui contient les fichiers.

Si vous ajoutez l'option --color ou utilisez d'autres options ls qui doivent examiner les fichiers eux-mêmes, alors ls devra stat (2) ces fichiers.

Il est fort probable qu'au moins un des fichiers de votre répertoire soit réellement monté à partir d'un système distant, via NFS ou similaire. Et le serveur à partir duquel vous avez monté cette partition ne fonctionne pas ou ne répond pas. Ainsi, lorsque ls essaie d'obtenir les informations sur ce répertoire, il se bloque dans le noyau en attendant que le serveur réponde.

Comme d'autres l'ont mentionné, si vous utilisez strace, vous découvrirez à quel répertoire ls tente d'accéder lorsqu'il se bloque. Ensuite, vous pouvez démonter cette partition montée ou autre chose.

Scientifique fou
la source
Une autre possibilité est que l'un des fichiers de votre répertoire soit un lien symbolique pointant vers une partition distante et dont le serveur ne répond pas ... même principe.
MadScientist
J'avais monté nfs à partir d'un serveur qui était en panne. Semble bizarre que stat se bloque simplement sur la monture nfs étant en panne. Ce ne serait pas trop difficile de dire s'il était en panne et d'imprimer simplement le répertoire dans la couleur dans laquelle les liens symboliques cassés sont imprimés.
Snitse
En fait, il est difficile (pour ls) de dire que le serveur NFS est en panne. NFS est juste un type de système de fichiers différent (comme ext3, xfs, etc.) Tous les systèmes de fichiers sont implémentés dans le noyau. Un programme utilisateur comme ls (1) exécute simplement un appel système comme stat (2) sur un chemin; il n'a aucune idée du type de système de fichiers utilisé. Dans ce cas, l'appel système se bloque (de sorte que l'application de l'espace utilisateur est bloquée) jusqu'à ce que le résultat soit obtenu. Donc, ls est mis en veille par le noyau jusqu'à ce que le résultat soit obtenu ... ce qui n'arrive jamais. Donc, je ne peux pas dire que quelque chose ne va pas.
MadScientist
Je dois dire que vous POUVEZ changer le comportement de NFS. Si vous spécifiez un "montage dur", le noyau essaiera à tout moment de se reconnecter si le serveur arrive à expiration et ne reviendra pas de l'appel système avant que cela ne se produise. Alternativement, vous pouvez demander un "montage souple", où le noyau revient avec un échec si la demande du serveur expire. Cependant, de nombreux programmes / la plupart ne sont pas écrits pour gérer correctement ces types d'opérations d'expiration, et donc la spécification de montages logiciels dans NFS est dangereuse et provoque une instabilité du système. Ceux qui utilisent régulièrement NFS utilisent et recommandent pratiquement toujours des supports durs. Voir nfs (5).
MadScientist
J'avais des sshfsmontures, et la seule façon de les démonter était de tuer les éléments liés sshet les sshfsprocessus.
Gauthier