In einem kleinen Verzeichnis dauert es lange

21

Unter Ubuntu öffne ich ein Terminal und mache

sudo bash
cd /
ls | head -n 1000

Und voraussichtlich werden ungefähr 20 Verzeichnisse zurückgegeben.

Wenn ich jedoch ein ls mache und es nicht in irgendetwas hineinpfeife, hängt das ls nur dort, bis ich es von einem anderen Terminal aus töte. Was könnte passieren?

BEARBEITEN:

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

BEARBEITEN:

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

Warum hängt der Befehl beim Färben der Ausgabe von ls?

Snitse
quelle
3
Laufen Sie type ls, um mögliche Aliase usw. zu überprüfen
jw013
5
Das Ausführen strace lskann Ihnen möglicherweise dabei helfen, das Problem zu identifizieren. straceZeigt alle Systemaufrufe des aufgerufenen Programms an.
Gowtham
2
Versuchen Sie /bin/ls(oder besser gesagt command ls), lsohne die Alias-Optionen auszuführen, um zu bestätigen, ob die Farboption den Unterschied ausmacht oder nicht. FWIW: Deaktiviert lsdie Färbung, wenn es sich bei der Ausgabe um eine Pipe oder ein anderes Nicht-Terminal-Gerät handelt.
jw013
3
Ein Backslash, bevor ein Befehl ihn anstelle des Alias ​​ausführt. \ls
Rob

Antworten:

28

Wenn Sie ls normal ausführen, wird nur die Liste der Dateien angezeigt, ohne dass stat (2) für eine dieser Dateien ausgeführt werden muss. Mit anderen Worten, es greift nicht auf die DATEIEN selbst zu, sondern nur auf das Verzeichnis, in dem sich die Dateien befinden.

Wenn Sie die Option --color hinzufügen oder andere ls-Optionen verwenden, um die Dateien selbst zu untersuchen, muss ls diese Dateien stat (2).

Höchstwahrscheinlich wird mindestens eine der Dateien in Ihrem Verzeichnis tatsächlich von einem Remote-System über NFS oder ähnliches bereitgestellt. Und der Server, von dem aus Sie diese Partition gemountet haben, ist nicht in Betrieb oder antwortet nicht. Wenn ls versucht, die Informationen zu diesem Verzeichnis abzurufen, hängt es im Kernel und wartet darauf, dass der Server antwortet.

Wie bereits erwähnt, können Sie mit strace feststellen, auf welches Verzeichnis zugegriffen wird, wenn es hängt. Dann können Sie diese gemountete Partition oder was auch immer umounten.

Verrückter Wissenschaftler
quelle
Eine andere Möglichkeit ist, dass eine der Dateien in Ihrem Verzeichnis ein Symlink ist, der auf eine entfernte Partition verweist und deren Server nicht reagiert ... dasselbe Prinzip.
MadScientist
Ich hatte NFS von einem Server gemountet, der inaktiv war. Scheint seltsam, dass stat nur am nfs-Mount hängt, der nicht erreichbar ist. Wäre nicht zu schwer zu sagen, ob es nicht funktioniert hat, und drucken Sie das Verzeichnis einfach in der Farbe, in der defekte Symlinks gedruckt werden.
Snitse
Tatsächlich ist es (für ls) schwer zu sagen, dass der NFS-Server inaktiv ist. NFS ist nur eine andere Art von Dateisystem (wie ext3, xfs usw.). Alle Dateisysteme sind im Kernel implementiert. Ein Benutzerprogramm wie ls (1) führt einfach einen Systemaufruf wie stat (2) für einen Pfadnamen aus. Es hat keine Ahnung, welche Art von Dateisystem verwendet wird. In diesem Fall bleibt der Systemaufruf hängen (die Userspace-App bleibt also hängen), bis das Ergebnis erhalten wird. Also wird ls vom Kernel in den Ruhezustand versetzt, bis das Ergebnis erreicht ist ... was niemals passiert. Also kann ich nicht sagen, dass etwas nicht stimmt.
MadScientist
Ich sollte sagen, dass Sie das Verhalten von NFS ändern KÖNNEN. Wenn Sie einen "Hard Mount" angeben, versucht der Kernel für immer, die Verbindung wiederherzustellen, wenn der Server eine Zeitüberschreitung aufweist und erst dann vom Systemaufruf zurückkehrt. Alternativ können Sie einen "Soft Mount" anfordern, bei dem der Kernel mit einem Fehler zurückkehrt, wenn die Serveranforderung eine Zeitüberschreitung aufweist. Viele / die meisten Programme sind jedoch nicht für die ordnungsgemäße Verarbeitung dieser Art von Timeout-Vorgängen geschrieben. Das Festlegen von Soft-Mounts in NFS ist daher gefährlich und führt zu Systeminstabilität. Diejenigen, die NFS regelmäßig verwenden, verwenden und empfehlen praktisch immer Hardmounts. Siehe nfs (5).
MadScientist
Ich hatte sshfsReittiere, und die einzige Möglichkeit, sie abzunehmen, bestand darin, die damit verbundenen Vorgänge sshund sshfsProzesse zu beenden .
Gauthier