Sni*_*tse 25 command-line ls shell files
运行 Ubuntu,我打开一个终端并执行
sudo bash
cd /
ls | head -n 1000
Run Code Online (Sandbox Code Playgroud)
并且可以预见地返回大约 20 个目录。
但是,如果我执行 ls,并且不将其通过管道传输到任何内容中,则 ls 只会挂在那里,直到我从另一个终端将其杀死。会发生什么?
编辑:
> type ls
ls is aliased to `ls --color=auto`
Run Code Online (Sandbox Code Playgroud)
编辑:
> /bin/ls /
<normal response>
> /bin/ls --color=auto
<hangs indefinitely>
Run Code Online (Sandbox Code Playgroud)
为什么对 ls 的输出着色会导致此命令挂起?
Mad*_*ist 33
如果您正常运行 ls ,它将只显示文件列表,而无需对其中任何一个运行 stat(2) 。换句话说,它不访问文件本身,而只访问包含文件的目录。
如果您添加 --color 选项,或使用其他需要检查文件本身的 ls 选项,则 ls 将需要 stat(2) 这些文件。
最有可能的是,您目录中的至少一个文件实际上是通过 NFS 或类似方式从远程系统挂载的。并且您挂载该分区的服务器未启动或没有响应。因此,当 ls 尝试获取有关该目录的信息时,它将挂在内核中等待服务器响应。
正如其他人所提到的,如果您使用 strace,您将找出 ls 在挂起时尝试访问的目录。然后你可以卸载那个挂载的分区或其他任何东西。