Ich habe in Verzeichnissen mit vielen Dateien auf NFS bemerkt, wenn ich es tue
ls *
dann drücken Sie Strg-C, es kann eine Weile dauern (z. B. 20 Sekunden), bis ls zurückkommt.
Wieso den? Kann der Befehl ls korrigiert werden, um reaktionsschneller zu sein?
Akzeptierte Antwort:
Wenn Sie ls *
ausführen , ist das erste, was passiert, dass die Shell eine Auflistung des aktuellen Verzeichnisses erhält. Wenn das Verzeichnis sehr groß und der Server langsam ist, kann dies eine Weile dauern.
Sobald die Shell die Liste der Dateinamen im aktuellen Verzeichnis erhalten hat, sortiert sie diese Liste (was im Vergleich zu jeder Netzwerkinteraktion sehr schnell geht) und ruft dann ls
auf . Die ls
Der Befehl sucht nacheinander jede Datei und ruft ihre Metadaten ab (stat
call), um zu prüfen, ob es sich um ein Verzeichnis handelt; wenn eine Datei ein Verzeichnis ist, ls
listet seinen Inhalt statt des Verzeichnisses selbst auf.
Wenn Sie Strg drücken +C , wird der aktuelle NFS-Vorgang dadurch nicht unterbrochen. Sie können eine Dateisystemoperation nicht irgendwo unterbrechen, da dies das System in einen inkonsistenten Zustand versetzen könnte. Selbst das Lesen einer Datei kann ihre Zugriffszeit aktualisieren. Meistens erfolgt ein elementarer Lese- oder Schreibvorgang für eine Datei nach menschlichen Maßstäben sofort, aber NFS ist eine Ausnahme, insbesondere bei großen Datenmengen über ein langsames Netzwerk.
Drücken Sie also Strg +C wird nur wirksam:
- wenn die Shell gerade die Liste der Dateinamen generiert, wenn diese Liste vollständig abgerufen wurde;
- wenn
ls
wurde gestartet und erhält gerade Metadaten über eine Datei, wenn der Server die Metadaten liefert; - wenn
ls
gestartet wurde und gerade ein Verzeichnis auflistet, wenn die Liste vollständig abgerufen ist, oder zumindest nach einem Teil davon.
Es ist nicht die Schuld des ls
Befehl (der möglicherweise noch nicht einmal gestartet wurde). Es ist nicht einmal die Schuld der Shell:Es ist die Schuld von NFS. NFS ist ziemlich langsam.