我正在尝试监视NFS共享并通过远程系统上运行的进程检测文件的创建.问题是文件创建后检测不起作用,我的脚本仍然认为没有文件.如果有人在目录中执行ls,或者我在后台运行一个单独执行ls的单独进程,那么脚本将会检测到该文件是否存在.但是,将“ls the directory”功能添加到主脚本中是行不通的:它仍然永远不会检测到文件是否存在,直到外部进程导致目录列表内容以某种方式刷新.
这是一个说明问题的测试用例:
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
…回到“主机-A”,程序还没有退出:
host-A%
…仍然在“host-A”上,在目录中执行ls,然后脚本会看到该文件:
host-A% ls -a /nfs . .. test host-A% [1]+ Done ./watch_file.pl & host-A%
解决方法
默认情况下,大多数NFS客户端缓存目录信息60秒.
使用noac选项在客户端上挂载NFS共享以禁用属性缓存,或使用acdirmin = 0,acdirmax = 0来禁用目录缓存.