Ho notato nelle directory con molti file su NFS se lo faccio
ls *
quindi premi Ctrl-C può volerci un po' (diciamo 20 secondi) prima che ls torni.
Come mai? Il comando ls può essere corretto per essere più reattivo?
Risposta accettata:
Quando esegui ls *
, la prima cosa che succede è che la shell ottiene un elenco della directory corrente. Se la directory è enorme e il server è lento, l'operazione potrebbe richiedere del tempo.
Una volta che la shell ha ottenuto l'elenco dei nomi dei file nella directory corrente, ordina quell'elenco (che è molto veloce rispetto a qualsiasi interazione di rete), quindi chiama ls
. Il ls
comando cerca ogni file a turno e ne recupera i metadati (stat
call) per verificare se si tratta di una directory; se un file è una directory, ls
elenca il suo contenuto anziché la directory stessa.
Quando premi Ctrl +C , questo non interromperà l'operazione NFS corrente. Non puoi interrompere un'operazione del filesystem ovunque, in quanto ciò potrebbe lasciare il sistema in uno stato incoerente. Anche la lettura di un file potrebbe aggiornare il suo tempo di accesso. Il più delle volte, un'operazione di lettura o scrittura elementare su un file è istantanea per gli standard umani, ma NFS è un'eccezione, specialmente con grandi quantità di dati su una rete lenta.
Quindi premendo Ctrl +C avrà effetto solo:
- se la shell sta attualmente generando l'elenco dei nomi di file, quando l'elenco sarà completamente recuperato;
- se
ls
è stato avviato e sta attualmente ottenendo metadati su un file, quando il server fornisce i metadati; - se
ls
è stato avviato e sta attualmente elencando una directory, quando l'elenco è stato completamente recuperato, o almeno dopo una parte di esso.
Non è colpa dei ls
comando (che potrebbe non essere stato ancora avviato). Non è nemmeno colpa della shell:è colpa di NFS. NFS è piuttosto lento.