我在 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
仅在/
目录上这两个命令才会挂起终端。
答案1
ls
/ ls -a
...只是读取当前目录的内容,它不会对文件执行任何操作。
ls -l
或者ls -F
或ls --color
需要从列出的文件本身获取元数据信息(权限、类型、所有权、修改时间...)。因此,除了getdents()
读取目录内容的系统调用之外,它还需要lstat()
对其中列出的每个文件执行 a 操作,还需要对readlink()
符号链接执行 a 操作(以及对带有or的某些实现的stat()
符号链接执行 a 操作)。ls
-F
--color
对于+
或@
和其他可选的备用访问方法标志有时发现在获得权限后,可能需要执行一些额外的系统调用(例如getxattr()
在 Linux 上检索 ACL)。
使用 时ls -l
,还需要查询用户数据库,将 uid 和 gid 转换为用户名和组名。
因此,虽然对于一个简单的,我们只需要打开一个文件(当前工作目录)并读取其内容,但很容易看出// ...ls
失败的范围更大:-l
-F
--color
lstat()
如果文件是不可用的文件系统上的安装点,则可能会失败或挂起。stat()
如果符号链接的目标位于不可用的文件系统上,则符号链接上的 可能会失败。- 对用户数据库的查询可能会失败或挂起(例如在使用网络 (LDAP/NIS+) 用户数据库的部署中)。
答案2
我的目录中的其中一个文件夹/
是卷文件夹,从另一台机器挂载,这台机器已关闭。挂载的目录无法访问。