Você descreve o tail
utilitário GNU . A diferença entre esses dois sinalizadores é que, se eu abrir um arquivo, um arquivo de log, por exemplo, assim:
$ tail -f /var/log/messages
... e se o recurso de rotação de logs da minha máquina decidir girar esse arquivo de log enquanto estou assistindo as mensagens serem gravadas nele ("girar" significa excluir ou mover para outro local etc.), a saída que eu vejo será apenas Pare.
Se eu abrir o arquivo tail
assim:
$ tail -F /var/log/messages
... e novamente, o arquivo é girado, a saída continuaria fluindo no meu console, porque tail
reabriria o arquivo assim que estivesse novamente disponível, ou seja, quando o (s) programa (s) gravando no log começaram a gravar no novo /var/log/messages
.
Nos sistemas BSD gratuitos, não há -F
opção, mas tail -f
se comportará como tail -F
nos sistemas GNU, com a diferença de que você recebe a mensagem
tail: file has been replaced, reopening.
na saída quando o arquivo que você está monitorando desaparece e reaparece.
VOCÊ PODE TESTAR ISSO
Em uma sessão shell, faça
$ cat >myfile
Agora, isso irá esperar você digitar as coisas. Apenas vá em frente e digite algumas palavras sem sentido, algumas linhas. Tudo será salvo no arquivo myfile
.
Em outra sessão do shell (talvez em outro terminal, sem interromper ocat
):
$ tail -f myfile
Isso mostrará o (final do) conteúdo myfile
no console. Se você voltar para a primeira sessão do shell e digitar algo mais, essa saída será mostrada imediatamente tail
na segunda sessão do shell.
Agora saia cat
pressionando Ctrl+De remova o myfile
arquivo:
$ rm myfile
Em seguida, execute o gato novamente:
$ cat >myfile
... e digite algo, algumas linhas.
Com o GNU tail
, essas linhas não aparecerão na segunda sessão do shell (onde tail -f
ainda está em execução).
Repita o exercício com tail -F
e observe a diferença.
tail -f foo.log
e seu sistema passarfoo.log
para, por exemplo,foo.log.0.gz
a saída que você vê, seria interrompida. Se você usar-F
por outro lado, veria o conteúdo do novofoo.log
sem nenhuma interrupção.Simplificado, quando você abre um arquivo, você obtém o inode que contém alguns metadados de onde exatamente o arquivo está localizado no seu disco. O Tail então escutará as alterações nesse arquivo.
Se você remover o arquivo e criar um novo com o mesmo nome, o nome do arquivo será o mesmo, mas é um inode diferente (e provavelmente armazenado em um local diferente do disco).
tail -f
preencha, não tente novamente e carregue o novo inode,tail -F
detectará isso.O mesmo efeito ocorrerá se você renomear / mover um arquivo. Se, por exemplo, você segue
/var/log/messages
e faz o logrotate, o log é rotacionado para/var/log/messages.1
. tail with-f
ainda ouvirá o inode antigo que aponta paramessages.1
. cauda com-F
vai perceber isso e ler o novo inode.fonte