Como o parâmetro "-f" do comando "tail" funciona?

59
$ tail -f testfile

o comando deve mostrar as entradas mais recentes no arquivo especificado, em tempo real, certo? Mas isso não está acontecendo. Corrija-me, se o que pretendo fazer está errado ...

Criei um novo arquivo "aaa", adicionei uma linha de texto e a fechei. Em seguida, emitiu este comando (primeira linha):

$ tail -f aaa
xxx
xxa
axx

as últimas três linhas são o conteúdo do arquivo aaa. Agora que o comando ainda está em execução (desde que o usei -f), abri o arquivo aaa por meio da GUI e comecei a adicionar mais algumas linhas manualmente. Mas o terminal não mostra as novas linhas adicionadas no arquivo.

O que há de errado aqui? O tail -fcomando mostra apenas novas entradas se elas forem gravadas apenas pelo sistema? (como arquivos de log etc)

wsou eu
fonte

Respostas:

62

Na tail(1) página do manual :

   With  --follow  (-f),  tail  defaults to following the file descriptor,
   which means that even if a tail’ed file is renamed, tail will  continue
   to  track  its  end.   This  default behavior is not desirable when you
   really want to track the actual name of the file, not the file descrip-
   tor (e.g., log rotation).  Use --follow=name in that case.  That causes
   tail to track the named file  in  a  way  that  accommodates  renaming,
   removal and creation.

Seu editor de texto está renomeando ou excluindo o arquivo original e salvando o novo arquivo com o mesmo nome de arquivo. Use em -Fvez disso.

Ignacio Vazquez-Abrams
fonte
trabalhou! Então, eu posso usar o $ tail -F filenamecomando o tempo todo, em vez de $ tail -f filenamecerto?
its_me
17
Se esse é o seu comportamento pretendido. Não pode haver casos em que você quer seguir por descritor em vez de nome de arquivo, mas para ser justo eu não vim através de muitos daqueles.
Ignacio Vazquez-Abrams
lsofpode mostrar isso acontecendo - por exemplo lsof -Fpcftni, mostraria que o inode que está sendo seguido tailnão é mais o mesmo que o editor abriu.
Aaron D. Marasco 15/08
10

Seu editor possui seu próprio buffer para o arquivo. Quando você modifica o texto no editor, nada é gravado no próprio arquivo.

Quando você salva suas alterações, é possível que o editor exclua o arquivo antigo e crie um novo. tail -fainda estará conectado ao arquivo excluído, para que não mostre nada de novo.

Stéphane Gimenez
fonte
11
O editor substitui o arquivo, os logs anexam o texto. Este talvez seja o problema.
Rufo El Magufo
@ Juan: Eu não entendo o seu comentário. "substituir" não tem significado concreto, exceto o que descrevi na minha resposta.
Stéphane Gimenez
Sim, eu quis dizer o mesmo que você :)
Rufo El Magufo
3

tail "atualizar" a cada 1 segundo por padrão, não em tempo real.

Tente com isso (você precisa do bash4):

  • Abra 2 terminais.
  • No primeiro terminal, execute touch ~/output.txte tail -f ~/output.txt.
  • No segundo terminal, execute for i in {0..100}; do sleep 2; echo $i >> ~/output.txt ; done
  • Veja a saída da cauda no primeiro terminal.
Rufo El Magufo
fonte
Você quis dizer echo $i >> ~/output.txt? Além disso, esta resposta perde o objetivo da pergunta.
Ignacio Vazquez-Abrams
11
Sim, corrigi a falha enquanto você escrevia o comentário :). Minha resposta é apenas um teste para o problema O comando tail -f mostra apenas novas entradas se elas forem gravadas apenas pelo sistema?
Rufo El Magufo
4
@ Juan: Hoje em dia, no linux, tailftem uma implementação baseada em inotify. Portanto, ele será atualizado em tempo real.
Stéphane Gimenez
Sim tailf, mas tailusa inotify ?. Eu não sabia tailf. A página de manual da cauda mostra o padrão de 1 segundo para -s.
Rufo El Magufo
3
Sim, tailseguido e agora também está usando o inotify quando disponível. tailfnão está pesquisando, apenas dorme, quando não há atividade no arquivo. tail -fmostra alguma atividade (consulte a stracesaída).
Stéphane Gimenez