Это займет много времени в небольшом каталоге

21

Запустив Ubuntu, я открываю терминал и делаю

sudo bash
cd /
ls | head -n 1000

И, как и ожидалось, возвращается около 20 каталогов.

Однако, если я делаю ls и не направляю его во что-либо, ls просто висит там, пока я не убью его из другого терминала. Что может происходить?

РЕДАКТИРОВАТЬ:

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

РЕДАКТИРОВАТЬ:

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

Почему окраска вывода ls вызывает зависание этой команды?

Snitse
источник
3
Запустите, type lsчтобы проверить любые возможные псевдонимы и т. Д.
jw013
5
Запуск strace lsможет потенциально помочь вам определить проблему. straceотображает все системные вызовы, сделанные программой, которую она вызывает.
Gowtham
2
Попробуйте /bin/ls(или, скорее, command ls), чтобы запустить lsбез псевдонимов, чтобы убедиться, что это цвет вариант, который имеет значение. FWIW, lsотключает окраску, когда его выход представляет собой трубу или другое нетерминальное устройство.
jw013
3
обратная косая черта перед командой запускает ее вместо псевдонима. \ls
Роб

Ответы:

28

Если вы запустите ls нормально, он просто покажет список файлов без необходимости запуска stat (2) для любого из них. Другими словами, он не обращается к самим ФАЙЛАМ, а только к каталогу, содержащему файлы.

Если вы добавите опцию --color или воспользуетесь другими опциями ls, которые должны проверять сами файлы, то ls потребуется stat (2) для этих файлов.

Скорее всего, по крайней мере один из файлов в вашем каталоге на самом деле монтируется из удаленной системы, через NFS или аналогичный. И сервер, с которого вы смонтировали этот раздел, не работает или не отвечает. Таким образом, когда ls пытается получить информацию об этом каталоге, он зависает в ядре, ожидая ответа сервера.

Как уже упоминалось, если вы используете strace, вы узнаете, к какому каталогу ls пытается получить доступ, когда зависает. Затем вы можете размонтировать этот смонтированный раздел или что-то еще.

Сумасшедший ученый
источник
Другая возможность состоит в том, что один из файлов в вашем каталоге является символической ссылкой, указывающей на некоторый раздел, который является удаленным и сервер которого не отвечает ... тот же принцип.
MadScientist
У меня были смонтированы NFS с сервера, который был недоступен. Кажется странным, что stat просто висит на монтируемом nfs. Не будет слишком сложно определить, был ли он неактивным, и просто распечатать каталог в том цвете, в котором печатаются сломанные символические ссылки.
Snitse
На самом деле, трудно (для ls) сказать, что сервер NFS не работает. NFS - это просто другой тип файловой системы (например, ext3, xfs и т. Д.). Все файловые системы реализованы в ядре. Пользовательская программа, такая как ls (1), просто запускает системный вызов, такой как stat (2), по пути; он не знает, какая файловая система используется. В этом случае системный вызов зависает (поэтому приложение пользовательского пространства зависает) до тех пор, пока не будет получен результат. Итак, ядро ​​усыпляет ls до тех пор, пока не будет получен результат ... чего никогда не происходит. Поэтому я не могу сказать, что что-то не так.
MadScientist
Я должен сказать, что вы можете изменить поведение NFS. Если вы укажете «жесткое монтирование», то ядро ​​будет пытаться восстановить соединение, если время ожидания сервера истекло, и не будет возвращаться из системного вызова, пока это не произойдет. В качестве альтернативы вы можете запросить «мягкое монтирование», когда ядро ​​возвращается с ошибкой, если запрос сервера истекает. Однако многие / большинство программ не написаны для правильной обработки этих типов операций тайм-аута, и поэтому указание программных монтировок в NFS опасно и вызывает нестабильность системы. Те, кто регулярно использует NFS, практически всегда используют и рекомендуют жесткие крепления. Смотрите NFS (5).
MadScientist
У меня были sshfsмаунты, и единственным способом, которым я мог их демонтировать, было уничтожение связанных с ними sshи sshfsпроцессов.
Готье