Запускаю 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 приводит к зависанию этой команды?
решение1
Если вы запустите ls обычным образом, он просто покажет список файлов без необходимости запуска stat(2) для любого из них. Другими словами, он не обращается к самим ФАЙЛАМ, а только к каталогу, содержащему файлы.
Если вы добавите опцию --color или используете другие опции ls, которые требуют проверки самих файлов, то ls необходимо будет выполнить stat(2) для этих файлов.
Скорее всего, по крайней мере один из файлов в вашем каталоге фактически монтируется с удаленной системы, через NFS или что-то подобное. А сервер, с которого вы смонтировали этот раздел, не работает или не отвечает. Поэтому, когда ls пытается получить информацию об этом каталоге, он зависает в ядре, ожидая ответа сервера.
Как уже упоминали другие, если вы используете strace, вы узнаете, к какому каталогу ls пытается получить доступ, когда он зависает. Затем вы можете размонтировать этот смонтированный раздел или что-то в этом роде.