Por que algumas linhas são perdidas quando a cauda está em um arquivo em uma montagem de samba?

1

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?

    
por Eric Johnson 19.09.2013 / 17:17

1 resposta

0

Em suma, não, não há como forçar a cauda para mostrar a você todas as linhas postadas em um sistema de arquivos montado.

Eu não sei o funcionamento interno da cauda (eu não olhei para a fonte ultimamente), mas se bem me lembro, ele constantemente busca o final do arquivo e quando o EOF se move, ele relata o conteúdo de por último procurar EOF.

Isso soa como deveria funcionar como esperado, mas devido à natureza montada do sistema de arquivos, as alterações de EOF nem sempre são imediatamente aparentes. As gravações em buffer são a causa subjacente (novamente, se bem me lembro).

Se você tiver que pegar todas as linhas, então deve sair de uma montaria.

    
por 19.09.2013 / 17:40

Tags