Я пытаюсь отслеживать общий ресурс 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
... вернуться к "host-A", программа еще не завершилась:
host-A%
... все еще на "host-A", выполните команду ls в каталоге, тогда скрипт увидит файл:
host-A% ls -a /nfs
. .. test
host-A%
[1]+ Done ./watch_file.pl &
host-A%
Кто-нибудь знает простое исправление или обходной путь для этого, который был бы менее хитрым, чем запуск скрипта в фоновом режиме для ls каталога NFS каждые 10 секунд?
По умолчанию большинство клиентов NFS кэшируют информацию о каталоге в течение 60 секунд.
Смонтируйте общий ресурс NFS на клиенте с noac
возможность отключить кеширование атрибутов или использовать acdirmin=0,acdirmax=0
просто отключить кеширование каталогов.