Займаю тривалий час у невеликому каталозі


21

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

sudo bash
cd /
ls | head -n 1000

І передбачувано повертається близько 20 каталогів.

Однак, якщо я роблю ls, і не вкладаю його ні в що, я просто зависаю там, поки не вб'ю його з іншого терміналу. Що може статися?

Редагувати:

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

Редагувати:

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

Чому забарвлення виводу ls викликає зависання цієї команди?


3
Запустіть, type lsщоб перевірити будь-які можливі псевдоніми тощо
jw013

5
Біг strace lsпотенційно може допомогти вам визначити проблему. straceвідображає всі системні дзвінки, здійснені програмою, яку вона викликає.
Гоутем

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 із сервера, який не працював. Дивно здається, що статист просто висить на горі nfs, будучи вниз. Не буде занадто важко сказати, чи було воно вниз, а просто надрукуйте каталог у кольорі, на якому надруковані зламані символьні посилання.
Сніце

Насправді, важко (за ls) сказати, що сервер NFS не працює. NFS - це лише інший тип файлової системи (наприклад, ext3, xfs тощо). Усі файлові системи реалізовані в ядрі. Користувацька програма на зразок ls (1) просто виконує системний виклик типу stat (2) на ім'я шляху; він не має уявлення про те, яка файлова система використовується. У цьому випадку системний виклик зависає (так що програма користувальницького простору підвішена) до отримання результату. Отже, ls укладається ядром до сну, поки не буде отриманий результат ... що ніколи не відбувається. Тож я не можу сказати, що щось не так.
MadScientist

Я повинен сказати, що ви МОЖЕТЕ змінити поведінку NFS. Якщо ви вказали "жорстке кріплення", ядро ​​буде намагатися назавжди підключитися, якщо сервер вимкнеться та не повернеться із системного виклику, поки цього не станеться. Крім того, ви можете надіслати запит на "м'яке кріплення", де ядро ​​повертається з помилкою, якщо сервер запитує час. Однак багато / більшість програм не написані для належного поводження з цими типами операцій тайм-ауту, і тому визначення м'яких кріплень у NFS є небезпечним та викликає нестабільність системи. Ті, хто регулярно використовує NFS, практично завжди користуються і рекомендують жорсткі кріплення. Див. Nfs (5).
MadScientist

Я мав sshfsмонтує, і єдиний спосіб , яким я міг би демонтувати їх було вбиваючи пов'язане sshі sshfsпроцеси.
Готьє
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.