运行 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 的输出进行着色会导致该命令挂起?
答案1
如果正常运行 ls,它只会显示文件列表,而无需对其中任何一个运行 stat(2)。换句话说,它不访问文件本身,而仅访问包含文件的目录。
如果添加 --color 选项,或使用其他需要检查文件本身的 ls 选项,则 ls 将需要 stat(2) 这些文件。
最有可能的是,目录中的至少一个文件实际上是通过 NFS 或类似方式从远程系统挂载的。并且您安装该分区的服务器未启动或没有响应。因此,当 ls 尝试获取有关该目录的信息时,它将挂在内核中等待服务器响应。
正如其他人提到的,如果您使用 strace,您会发现 ls 挂起时试图访问哪个目录。然后您可以卸载已安装的分区或其他任何东西。