Eu nunca usei tail -F
o comando, sempre usei, tail -f
porém alguém me disse que -F
é melhor sem muita explicação.
Procurei na página de manual o comando tail.
-f output appended data as the file grows;
-F Same as --follow=name --retry
--retry Keep trying to open a file even when it is or becomes inaccessible
É fácil entender o que o minúsculo -f
faz, mas não sigo o que o maiúsculo -F
está tentando fazer. Eu apreciaria que alguém pudesse me explicar as diferenças.
Responder1
Você descreve o tail
utilitário GNU. A diferença entre esses dois flags é 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 log em minha máquina decidir girar esse arquivo de log enquanto estou observando as mensagens sendo gravadas nele ("girar" significa excluir ou mover para outro local etc.), a saída que vejo será apenas parar.
Se eu abrir o arquivo tail
assim:
$ tail -F /var/log/messages
... e novamente, o arquivo é girado, a saída continuaria a fluir no meu console porque tail
reabriria o arquivo assim que ele ficasse disponível novamente, ou seja, quando o (s) programa (s) que estava gravando no log começasse a gravar nonovo /var/log/messages
.
Nos sistemas BSD livres, não há -F
opção, mas tail -f
se comportará como tail -F
nos sistemas GNU, com a diferença de que você receberá 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 de shell, faça
$ cat >myfile
Isso agora esperará que você digite as coisas. Vá em frente e digite algum jargão, algumas linhas. Tudo será salvo no arquivo myfile
.
Emoutrosessão shell (talvez em outro terminal,sem interromper ocat
):
$ tail -f myfile
Isso mostrará o (fim do) conteúdo do myfile
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+Deremovero myfile
arquivo:
$ rm myfile
Em seguida, execute o gato novamente:
$ cat >myfile
... e digite algo, algumas linhas.
Com o GNU tail
, essas linhas serãonãoaparece 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.
Responder2
Simplificado, ao abrir um arquivo, você obterá o inode que contém alguns metadados de onde exatamente o arquivo está localizado em seu disco. Tail irá então ouvir 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 será um inode diferente (e provavelmente armazenado em um local diferente no disco). tail -f
preencha, não tente novamente e carregue o novo inode, tail -F
detectará isso.
O mesmo efeito acontecerá se você renomear/mover um arquivo. Se você, por exemplo, seguir /var/log/messages
e logrotate girar o log para /var/log/messages.1
. tail with -f
ainda ouvirá o inode antigo que aponta para messages.1
. tail with -F
perceberá isso e lerá o novo inode.