Zajmuje dużo czasu w małym katalogu

21

Uruchamiając Ubuntu, otwieram terminal i robię

sudo bash
cd /
ls | head -n 1000

I przewidywalnie zwracanych jest około 20 katalogów.

Jeśli jednak zrobię ls i nie podłączę go do niczego, ls po prostu wisi tam, dopóki nie zabiję go z innego terminalu. Co może się dziać?

EDYTOWAĆ:

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

EDYTOWAĆ:

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

Dlaczego kolorowanie wyjścia ls powoduje zawieszenie się tego polecenia?

Snitse
źródło
3
Uruchom, type lsaby sprawdzić ewentualne aliasy itp.
jw013
5
Uruchomienie strace lsmoże potencjalnie pomóc zidentyfikować problem. stracewyświetla wszystkie wywołania systemowe wykonane przez program, który wywołuje.
Gowtham
2
Spróbuj /bin/ls(a raczej command ls) uruchomić lsbez opcji aliasu, aby potwierdzić, czy to opcja koloru robi różnicę. FWIW, lswyłącza kolorowanie, gdy jego wyjściem jest potok lub inne urządzenie nieterminalne.
jw013
3
także odwrotny ukośnik, zanim polecenie uruchomi je zamiast aliasu. \ls
Rob

Odpowiedzi:

28

Jeśli uruchomisz ls normalnie, po prostu wyświetli listę plików bez konieczności uruchamiania stat (2) na żadnym z nich. Innymi słowy, nie uzyskuje dostępu do samych PLIKÓW, a jedynie do katalogu zawierającego pliki.

Jeśli dodasz opcję --color lub użyjesz innych opcji ls, które same muszą zbadać pliki, ls będzie musiał stat (2) te pliki.

Najprawdopodobniej przynajmniej jeden z plików w twoim katalogu jest faktycznie montowany ze zdalnego systemu, przez NFS lub podobny. A serwer, z którego zamontowałeś tę partycję, nie działa lub nie odpowiada. Kiedy więc ls próbuje uzyskać informacje o tym katalogu, zawiesi się w jądrze, czekając na odpowiedź serwera.

Jak wspomnieli inni, jeśli użyjesz strace, dowiesz się, do którego katalogu ls próbuje uzyskać dostęp, gdy się zawiesi. Następnie możesz zamontować zamontowaną partycję lub cokolwiek innego.

Szalony naukowiec
źródło
Inną możliwością jest to, że jeden z plików w katalogu jest dowiązaniem symbolicznym wskazującym na zdalną partycję, której serwer nie odpowiada ... ta sama zasada.
MadScientist
Miałem nfs zamontowane z serwera, który nie działa. Wydaje się dziwne, że statystyki po prostu zawieszają się na wierzchowcu NFS. Nie byłoby zbyt trudno stwierdzić, czy był wyłączony i po prostu wydrukować katalog w kolorze, w którym drukowane są uszkodzone dowiązania symboliczne.
Snitse
W rzeczywistości trudno jest (dla ls) stwierdzić, że serwer NFS jest wyłączony. NFS to po prostu inny typ systemu plików (jak ext3, xfs itp.) Wszystkie systemy plików są zaimplementowane w jądrze. Program użytkownika, taki jak ls (1), po prostu uruchamia wywołanie systemowe, takie jak stat (2) na ścieżce; nie ma pojęcia, jakiego rodzaju systemu plików używa się. W takim przypadku połączenie systemowe zawiesza się (więc aplikacja przestrzeni użytkownika jest zawieszona), dopóki nie zostanie uzyskany wynik. Zatem jądro usypia ls, dopóki nie zostanie uzyskany wynik ... co nigdy się nie zdarza. Więc nie mogę powiedzieć, że coś jest nie tak.
MadScientist
Powinienem powiedzieć, że MOŻESZ zmienić zachowanie NFS. Jeśli określisz „hard mount”, jądro będzie próbowało na zawsze połączyć się ponownie, jeśli serwer przekroczy limit czasu i nie wróci z wywołania systemowego, dopóki tak się nie stanie. Alternatywnie możesz zażądać „miękkiego montażu”, w którym jądro powróci z błędem, jeśli upłynie limit czasu żądania serwera. Jednak wiele / większość programów nie jest napisanych, aby poprawnie obsługiwać tego typu operacje przekroczenia limitu czasu, dlatego określenie miękkiego montowania w NFS jest niebezpieczne i powoduje niestabilność systemu. Ci, którzy regularnie używają NFS, praktycznie zawsze używają i zalecają mocowanie twarde. Zobacz nfs (5).
MadScientist
Miałem sshfswierzchowce, a jedynym sposobem na ich odmontowanie było zabicie powiązanych sshi sshfsprocesów.
Gauthier