Qual é a diferença entre “tail -f” e “tail -F”?

37

Eu nunca usei o comando tail -F , mas sempre usei tail -f , mas alguém me disse que -F é melhor sem muita explicação.

Eu procurei na man page pelo 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 -f menor faz, mas eu não sigo o que -F está tentando fazer. Eu gostaria que alguém me explicasse as diferenças.

    
por DaeYoung 24.06.2016 / 20:44

2 respostas

66

Você descreve o utilitário GNU tail . 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 log na minha máquina decidir girar esse arquivo de log enquanto eu estiver vendo as mensagens sendo gravadas nele ("girar" significa excluir ou mover para outro local etc.), a saída que eu veja, vai parar.

Se eu abrir o arquivo com tail da seguinte forma:

$ 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 se tornasse disponível novamente, ou seja, quando o (s) programa (s) gravasse no log começou a escrever para o novo /var/log/messages .

Nos sistemas BSD gratuitos, não há -F , mas tail -f se comportará como tail -F nos sistemas GNU, com a diferença 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

Em uma sessão de shell, faça

$ cat >myfile

Isso agora vai esperar que você digite coisas. Basta ir em frente e digitar alguns rabiscos, algumas linhas. Tudo será salvo no arquivo myfile .

Em outra sessão shell (talvez em outro terminal, sem interromper o cat ):

$ tail -f myfile

Isso mostrará o (final do) conteúdo de myfile no console. Se você voltar para a primeira sessão de shell e digitar algo mais, essa saída será mostrada imediatamente por tail na segunda sessão de shell.

Agora saia de cat pressionando Ctrl + D e remova o arquivo myfile :

$ 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 de shell (onde tail -f ainda está em execução).

Repita o exercício com tail -F e observe a diferença.

    
por 24.06.2016 / 20:58
13

Simplificado, quando você abre um arquivo, você obtém o inode que contém alguns metadados de onde exatamente o arquivo está localizado em seu disco. Tail, 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 fill não tenta novamente e carrega o novo inode, tail -F detectará isso.

O mesmo efeito acontecerá se você renomear / mover um arquivo. Se você, por exemplo, segue /var/log/messages e logrotate rotaciona o log para /var/log/messages.1 . tail com -f ainda vai ouvir o inode antigo que aponta para messages.1 . cauda com -F vai perceber isso e ler o novo inodo.

    
por 24.06.2016 / 20:57

Tags