Isto está na linha deComo começar a seguir um arquivo que ainda não foi criadocom uma diferença: já existe um arquivo com o nome.
Tenho um programa que é executado várias vezes; quando o nome do arquivo de saída já está em uso, ele renomeia o arquivo existente inserindo _XYZ
antes da extensão do arquivo onde XYZ
está o menor número inteiro (por exemplo, output.out
torna-se output_001.out
, ou output_002.out
se output_001.out
já existir, etc.) e cria um novo arquivo de saída com o nome principal.
Se eu seguir o nome primário, mesmo com -F
, ele começará a seguir o arquivo existente imediatamente e manterá o identificador para esse inode mesmo quando o arquivo for renomeado, ignorando o novo arquivo.
O programa é executado em um cluster compartilhado com gerenciamento de filas, portanto a execução começa com atrasos longos e variáveis.
É possível seguir o novo arquivo sem esperar que ele seja criado primeiro? Se sim, como?
Responder1
tail -F
já deveria fazer isso.
Crie um arquivo /tmp/t/file
. Então, no terminal 1, inicie tail -F
e deixe rodando:
anthony@Zia:~$ tail -F /tmp/t/file
a
b
tail: `/tmp/t/file' has become inaccessible: No such file or directory
tail: `/tmp/t/file' has appeared; following end of new file
c
d
No terminal 2, eu fiz:
anthony@Zia:/tmp/t$ echo a >> file
anthony@Zia:/tmp/t$ echo b >> file
anthony@Zia:/tmp/t$ mv -i file file.old; echo c >> file
anthony@Zia:/tmp/t$ echo d >> file
Como você pode ver, tail -F
de fato segue o nome, não o inode. Talvez você esteja usando um tail
que dá um significado diferente -F
(esse sinalizador é uma extensão BSD, copiada posteriormente pelo GNU também), ou sua versão está com bugs? Você também pode tentar tail --follow=name --retry
(sintaxe alternativa final do GNU) ou xtail
(que segue um diretório inteiro).