Všiml jsem si v adresářích se spoustou souborů na NFS, jestli to udělám
ls *
pak stiskněte Ctrl-C, může to chvíli trvat (řekněme 20 sekund), než se ls vrátí.
Proč? Je možné opravit příkaz ls, aby lépe reagoval?
Přijatá odpověď:
Když spustíte ls *
, první věc, která se stane, je, že shell získá výpis aktuálního adresáře. Pokud je adresář velký a server pomalý, může to chvíli trvat.
Jakmile shell získá seznam názvů souborů v aktuálním adresáři, seřadí tento seznam (což je velmi rychlé ve srovnání s jakoukoli síťovou interakcí), poté zavolá ls
. ls
příkaz postupně vyhledá každý soubor a načte jeho metadata (stat
call) pro kontrolu, zda se jedná o adresář; pokud je soubor adresář, ls
vypíše jeho obsah spíše než samotný adresář.
Když stisknete Ctrl +C , nepřeruší to aktuální provoz NFS. Operaci souborového systému nemůžete přerušit kdekoli, protože by to mohlo způsobit nekonzistentní stav systému. Dokonce i čtení souboru může aktualizovat jeho přístupovou dobu. Ve většině případů je základní operace čtení nebo zápisu do souboru podle lidských standardů okamžitá, ale NFS je výjimkou, zvláště u velkého množství dat v pomalé síti.
Tedy stisknutím Ctrl +C projeví se pouze:
- pokud shell aktuálně generuje seznam názvů souborů, když je tento seznam plně načten;
- pokud
ls
byl spuštěn a aktuálně získává metadata o souboru, když server metadata dodá; - pokud
ls
byl spuštěn a aktuálně vypisuje adresář, když je seznam plně načten, nebo alespoň po jeho části.
Není to chyba ls
příkaz (který možná ještě nebyl spuštěn). Není to ani chyba shellu:je to chyba NFS. NFS je dost pomalý.