Shell

ls 在小目錄中花費很長時間

  • December 13, 2012

執行 Ubuntu,我打開一個終端並執行

sudo bash
cd /
ls | head -n 1000

並且可以預見地返回大約 20 個目錄。

但是,如果我執行 ls 並且不將其通過管道傳輸到任何內容中,則 ls 只會掛在那裡,直到我從另一個終端將其殺死。會發生什麼?

編輯:

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

編輯:

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

為什麼著色 ls 的輸出會導致該命令掛起?

如果您正常執行 ls,它只會顯示文件列表,而無需對其中任何一個執行 stat(2)。換句話說,它不訪問文件本身,而只訪問包含文件的目錄。

如果您添加 –color 選項,或使用需要檢查文件本身的其他 ls 選項,則 ls 將需要 stat(2) 這些文件。

很可能您目錄中的至少一個文件實際上是通過 NFS 或類似方式從遠端系統掛載的。並且您安裝該分區的伺服器沒有啟動或沒有響應。因此,當 ls 嘗試獲取有關該目錄的資訊時,它將掛在核心中等待伺服器響應。

正如其他人所提到的,如果您使用 strace ,您會發現 ls 在掛起時試圖訪問哪個目錄。然後您可以解除安裝該已安裝的分區或其他任何內容。

引用自:https://unix.stackexchange.com/questions/35322