当我传递--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
正如评论中提到的,ls
NFS 挂载会导致两个单独的 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
运行时删除了该文件,请在此处报告,我们将看看还能尝试什么。