为什么没有任何参数(只有标志)的“ls”会给我“没有这样的文件或目录”?

为什么没有任何参数(只有标志)的“ls”会给我“没有这样的文件或目录”?

当我传递--color=always给 ls 时,它偶尔会输出一些No such file or directory错误,如下所示:

~/svn/projects/submm/adda/scat$ /bin/ls --color=always
ls: cannot access adda_output_f89: No such file or directory
ls: cannot access adda_output_f150: No such file or directory
ls: cannot access adda_output_f183: No such file or directory
ls: cannot access adda_output_f186: No such file or directory
ls: cannot access adda_output_f190: No such file or directory
...

稍后按照目录的内容,包括将子目录adda_output_f89染成目录颜色。

有一个正在运行的进程正在对该目录中的文件进行操作,但我认为它没有对所ls提到的目录执行任何操作。

它无法完全重现。到目前为止,我还没有成功找出它何时发生和何时不发生的模式。它似乎一波一波地发生。也许一个进程正在快速创建和删除目录,但我认为事实并非如此。

似乎只有当我传递 时才会发生这种情况--color=always,但我不能 100% 确定情况确实如此。通常我使用别名,这种情况ls='ls --classify --color=always --human-readable'确实会发生,但当我调用/bin/ls它时似乎不会发生。

编辑

ls -i给出这些文件:

? adda_output1_f243/  ? adda_output_f243/

ETC。

编辑

这是一个 nfs 文件系统。

什么可能导致此行为?这是某种竞争条件吗?

答案1

正如评论中提到的,lsNFS 挂载会导致两个单独的 NFS 调用,它们之间会有轻微的延迟。如果您怀疑某个进程可能会在目录中添加和删除条目,我肯定会寻求解释。下面是我测试该理论的方法。

如果问题在您运行时出现了很多次(即,通过手动运行多次ls很容易重现),您可以简单地:ls

{ ls;ls;ls; } 2>&1 | tee ls.out | grep 'No such file'

重新运行该命令直到出现错误,然后检查文件ls.out,找出它抱怨的文件,然后查看这些文件是否 1) 存在于输出的前 1/3 中,以及 2) 不存在于输出的后 1/3 中。由于这些文件(可能)在ls运行其中一个命令时被删除,因此应该不难确定它们是否在之前存在并在之后被删除。

如果复制非常耗时,您可以编写如下脚本(未经测试!):

#!/bin/bash

while /bin/true; do
  /bin/ls -lc >ls1.out 2>&1
  /bin/ls -lc >ls2.out 2>&1
  /bin/ls -lc >ls3.out 2>&1
  grep 'No such file' ls2.out >missing.out 2>&1
  if (( $? != 0 )); then
    echo "Found the error!"
    break
  fi
done

sleep如果您担心在不受约束的紧密循环中运行该程序会对性能产生影响,请添加 s。)

在会话中运行此脚本screen,稍后检查。当脚本退出并报告发现错误时,检查无法找到missing.out哪些文件ls,然后验证这些文件是否在 中列出ls1.out但未列出ls3.out

不要忘记验证报告的 ctime ls,以防这个神秘的过程碰巧删除了文件,然后重新创建一个具有相同名称的新文件,以便第三个文件ls列出它。:)

如果由于某种原因不是该进程在ls运行时删除了该文件,请在此处报告,我们将看看还能尝试什么。

相关内容