Linux
奇怪的掛起“ls -l”或“dir -l”不起作用
我在 Debian 伺服器上有一個奇怪的行為。
語境 :
Linux 3.16.0-4-amd64 #1 SMP Debian 3.16.7-ckt11-1+deb8u5 (2015-10-09) x86_64 GNU/Linux
使用者:
root
命令
ls
,ls -a
或完美執行ls -1
。dir
但是這些命令**ls -l
,dir -l
**只有在/
目錄上這些命令才會掛起終端。
ls
/ls -a
… 只是讀取目前目錄的內容,它不會對文件做任何事情。
ls -l
或者ls -F
需要ls --color
從列出的文件本身獲取元數據資訊(權限、類型、所有權、修改時間……)。因此,除了getdents()
讀取目錄內容的系統呼叫之外,它還需要lstat()
為其中列出的每個文件執行 a ,還需要readlink()
為符號連結執行 astat()
(以及對於帶有or的某些ls
實現的符號連結)。-F``--color
對於有時在權限後發現的
+
or@
和其他可選的替代訪問方法標誌,它可能需要執行一些額外的系統呼叫(例如getxattr()
在 Linux 上檢索 ACL)。使用
ls -l
,還需要查詢使用者數據庫,將 uid 和 gid 翻譯成使用者名和組名。所以,雖然對於一個簡單的.,我們只需要打開一個文件(目前工作目錄)並讀取它的內容,很容易看到/ /
ls
失敗的事情有更多的範圍……:-l``-F``--color
lstat()
如果文件是不可用的文件系統上的掛載點,則可能會失敗或掛起。- 如果符號連結的目標位於不可用的 fs 上,則
stat()
on a symlink 可能會失敗。- 對使用者數據庫的查詢可能會失敗或掛起(例如在使用網路 (LDAP/NIS+) 使用者數據庫的部署中。