Está tomando mucho tiempo en un directorio pequeño

21

Ejecutando Ubuntu, abro una terminal y hago

sudo bash
cd /
ls | head -n 1000

Y previsiblemente se devuelven unos 20 directorios.

Sin embargo, si hago un ls, y no lo canalizo a nada, el ls simplemente se cuelga allí hasta que lo mato desde otra terminal. ¿Qué podría estar pasando?

EDITAR:

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

EDITAR:

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

¿Por qué colorear el resultado de ls hace que este comando se bloquee?

Snitse
fuente
3
Ejecute type lspara verificar cualquier posible alias, etc.
jw013
55
Correr strace lspuede ayudarlo a identificar el problema. stracemuestra todas las llamadas al sistema realizadas por el programa que invoca.
Gowtham
2
Intente /bin/ls(o más bien command ls) ejecutar lssin las opciones con alias, para confirmar si es la opción de color la que está marcando la diferencia. FWIW, lsapaga la coloración cuando su salida es una tubería u otro dispositivo no terminal.
jw013
3
una barra invertida antes de que un comando lo ejecute en lugar del alias también. \ls
Rob

Respuestas:

28

Si ejecuta ls normalmente, solo mostrará la lista de archivos sin necesidad de ejecutar stat (2) en ninguno de ellos. En otras palabras, no accede a los ARCHIVOS, sino solo al directorio que contiene los archivos.

Si agrega la opción --color, o usa otras opciones ls que necesitan examinar los archivos, entonces ls necesitará stat (2) esos archivos.

Lo más probable es que al menos uno de los archivos en su directorio se esté montando desde un sistema remoto, a través de NFS o similar. Y el servidor desde el que ha montado esa partición no está activo o no responde. Entonces, cuando ls intenta obtener la información sobre ese directorio, se colgará en el kernel esperando que el servidor responda.

Como otros han mencionado, si usa strace, descubrirá a qué directorio ls está intentando acceder cuando se cuelga. Entonces puedes desmontar esa partición montada o lo que sea.

Científico loco
fuente
Otra posibilidad es que uno de los archivos en su directorio sea un enlace simbólico que apunta a alguna partición remota y cuyo servidor no responde ... el mismo principio.
MadScientist
Tenía nfs montado desde un servidor que estaba caído. Parece extraño que la estadística simplemente se cuelgue en el montaje nfs estando abajo. No sería demasiado difícil saber si estaba inactivo e imprima el directorio en el color en que se imprimen los enlaces simbólicos rotos.
Snitse
En realidad, es difícil (para ls) decir que el servidor NFS está inactivo. NFS es solo un tipo diferente de sistema de archivos (como ext3, xfs, etc.) Todos los sistemas de archivos se implementan en el núcleo. Un programa de usuario como ls (1) simplemente ejecuta una llamada al sistema como stat (2) en un nombre de ruta; no tiene idea de qué tipo de sistema de archivos se está utilizando. En este caso, la llamada del sistema se bloquea (por lo que la aplicación de espacio de usuario se bloquea) hasta que se obtiene el resultado. Entonces, el núcleo pone a dormir ls hasta que se obtiene el resultado ... lo que nunca sucede. Entonces no puedo decir que algo está mal.
MadScientist 01 de
Debo decir que PUEDES cambiar el comportamiento de NFS. Si especifica un "montaje duro", el kernel intentará volver a conectarse para siempre si el servidor agota el tiempo de espera y no volverá de la llamada del sistema hasta que eso ocurra. Alternativamente, puede solicitar un "montaje suave", donde el núcleo regresa con una falla si la solicitud del servidor agota el tiempo de espera. Sin embargo, muchos / la mayoría de los programas no están escritos para manejar adecuadamente este tipo de operaciones de tiempo de espera, por lo que especificar montajes suaves en NFS es peligroso y causa inestabilidad del sistema. Aquellos que usan NFS regularmente casi siempre usan y recomiendan montajes duros. Ver nfs (5).
MadScientist 01 de
Tenía sshfsmonturas, y la única forma en que podía desmontarlas era matando los procesos sshy los relacionados sshfs.
Gauthier