我正在尝试监视 NFS 共享并检测远程系统上运行的进程是否创建了文件。问题是,在创建文件后检测不起作用,我的脚本仍然认为没有文件。如果有人在目录中执行 ls,或者我运行一个单独的进程,该进程只是在后台定期执行 ls,那么脚本将检测到该文件存在。但是,将“ls 目录”功能添加到主脚本中不起作用:它仍然永远不会检测到文件的存在,直到外部进程以某种方式导致目录列表内容被刷新。
这是一个说明该问题的测试用例:
watch_file.pl:
#!/usr/bin/perl -w
my @stat;
while (1) {
@stat = stat("/nfs/test");
last if ($stat[1] && $stat[1] > 0);
}
在“host-A”上运行该简单脚本:
host-A% ./watch_file.pl &
[1] 9312
移至“host-B”并创建文件:
host-B% touch /nfs/test
...回到“host-A”,程序尚未退出:
host-A%
...仍然在“host-A”上,在目录中执行 ls,然后脚本会看到该文件:
host-A% ls -a /nfs
. .. test
host-A%
[1]+ Done ./watch_file.pl &
host-A%
是否有人知道一个简单的修复或解决方法,比每 10 秒在后台运行一个脚本来 ls NFS 目录更不俗气?
答案1
默认情况下,大多数 NFS 客户端会缓存目录信息 60 秒。
在客户端上安装 NFS 共享,并选择noac
禁用属性缓存,或acdirmin=0,acdirmax=0
仅禁用目录缓存。