Принудительное уведомление о создании файла в FAM или lighttpd
Среда: Debian, lighttpd, fam. Неясно, включено ли ядро виртуального частного сервера Dnotify или нет.
После того, как мой CGI создает файл в файловой системе, он отвечает на короткое сообщение клиенту, в браузере запускается java-скрипт, уведомляющий клиента о том, что файл готов к загрузке. Здесь есть одна проблема - большую часть времени клиент получает http 404
ошибка от lighttpd, особенно когда все эти программы работают на localhost. Я думаю, что эта проблема вызвана задержкой lighttpd, уведомляемой fam о создании файла. Я представляю, что все события происходят в следующей последовательности:
- CGI создает файл.
- CGI отвечает клиенту.
- клиент получает файл из lighttpd.
- lighttpd не находит файл в своем кеше.
Я могу себе представить, что такая проблема будет хуже, когда файл будет создан на удаленном хосте и получит уведомление от lighttpd через NFS.
Мой вопрос: как код CGI, чтобы сообщить lighttpd о создании файла, прежде чем ответить клиенту?
То есть как "вставить" шаг уведомления между шагами выше 1.
а также 2.
? Если я не могу сделать это с помощью lighttpd, но я могу сделать это с помощью nginx, я могу также рассмотреть возможность перехода на последний вариант. Точно так же я буду в порядке, чтобы переключиться с fam на другие мониторы чередования файлов.
С уважением,
1 ответ
lighttpd не кэширует отсутствие файла, поэтому проблема скорее всего в вашем CGI-скрипте. Сценарий CGI должен создать файл и закрыть его, чтобы ядро знало, что содержимое должно быть сброшено на диск, так как они все еще могут буферизоваться в stdio в процессе CGI. Только после этого скрипт должен отправить сообщение клиенту.
Как вы заметили, дополнительные шаги требуются, если CGI запускается на сервере, отличном от того, который получает второй запрос на файл, и файл хранится в NFS или другой удаленной файловой системе. Самое простое решение - заставить клиента подождать секунду или две и повторить попытку загрузки файла несколько раз, поскольку типичные настройки кэширования NFS составляют около 5 секунд.