Eu tenho um processo no host # 1 que é anexado periodicamente a um arquivo - foo.log.
Eu tenho um processo no host # 2 que tem acesso ao foo.log através de uma montagem do samba. E eu invoco tail -F nesse arquivo para observar sua saída em tempo real.
Algumas linhas são "perdidas" ou caídas pela cauda -F.
Uma investigação com strace revela que algumas das reads () retornam com um conjunto de bytes nulos.
nanosleep({1, 0}, NULL) = 0
fstat(3, {st_mode=S_IFREG|0660, st_size=54526947, ...}) = 0
read(3, "nanosleep({1, 0}, NULL) = 0
fstat(3, {st_mode=S_IFREG|0660, st_size=54526947, ...}) = 0
read(3, "%pre%%pre%%pre%%pre%%pre%%pre%%pre%%pre%%pre%%pre%%pre%%pre%%pre%%pre%%pre%%pre%%pre%%pre%%pre%%pre%%pre%%pre%%pre%%pre%%pre%%pre%%pre%%pre%%pre%%pre%%pre%%pre%"..., 8192) = 630
read(3, "", 8192) = 0
%pre%%pre%%pre%%pre%%pre%%pre%%pre%%pre%%pre%%pre%%pre%%pre%%pre%%pre%%pre%%pre%%pre%%pre%%pre%%pre%%pre%%pre%%pre%%pre%%pre%%pre%%pre%%pre%%pre%%pre%%pre%"..., 8192) = 630
read(3, "", 8192) = 0
Claro, algumas linhas são retornadas corretamente, então nem sempre são esses blocos de null.
Além disso, o mesmo comando strace invocado diretamente no sistema de arquivos do host # 1 que hospeda o foo.log nunca exibe esse bloco de leitura de byte nulo do strace.
É como se o servidor samba no host # 1 pudesse ver o tamanho do arquivo alterado, mas fosse impedido de ver o conteúdo em tempo real. Se o samba esperou apenas um segundo e tentou novamente, aposto que o conteúdo estaria lá.
Existe uma maneira de permitir que o samba permita arquivos tail -F em tempo real sem perder linhas?