1

У меня есть процесс на хосте № 1, который периодически добавляется в файл - foo.log.

У меня есть процесс на хосте № 2, который имеет доступ к foo.log через монтирование samba. И я вызываю tail -F для этого файла, чтобы наблюдать его вывод в реальном времени.

Некоторые строки "потеряны" или отброшены хвостом -F.

Исследование с использованием strace показывает, что некоторые операции read () возвращаются с набором нулевых байтов.

nanosleep({1, 0}, NULL)                 = 0                                               
fstat(3, {st_mode=S_IFREG|0660, st_size=54526947, ...}) = 0                               
read(3, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 8192) = 630
read(3, "", 8192)                       = 0    

Конечно, некоторые строки возвращаются правильно, поэтому не всегда эти блоки равны нулю.

Кроме того, та же самая команда strace, вызываемая непосредственно в файловой системе хоста № 1, на которой размещается foo.log, никогда не отображает этот блок чтения нулевого байта из strace.

Как будто сервер samba на хосте # 1 может видеть изменение размера файла, но не может видеть содержимое в режиме реального времени. Если бы самба подождала секунду и попробовала еще раз, держу пари, что содержимое будет там.

Есть ли способ включить samba для включения tail -F для файлов в режиме реального времени без удаления строк?

1 ответ1

0

Короче говоря, нет, нет способа заставить tail показать вам каждую строку, размещенную в смонтированной файловой системе.

Я не знаю внутреннюю работу хвоста (в последнее время я не смотрел на источник), но если я правильно помню, он постоянно стремится к концу файла, а когда EOF перемещается, он сообщает о содержимом от последней попытки до EOF.

Звучит так, будто все должно работать как положено, но из-за монтируемой природы вашей файловой системы изменения EOF не всегда очевидны. Буферизованные записи являются основной причиной (опять же, если я правильно помню).

Если вы должны получить каждую строку, то вы должны сойти с горы.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .