Seguindo um novo arquivo com um nome antigo

Seguindo um novo arquivo com um nome antigo

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 _XYZantes da extensão do arquivo onde XYZestá o menor número inteiro (por exemplo, output.outtorna-se output_001.out, ou output_002.outse output_001.outjá 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 -Fjá deveria fazer isso.

Crie um arquivo /tmp/t/file. Então, no terminal 1, inicie tail -Fe 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 -Fde fato segue o nome, não o inode. Talvez você esteja usando um tailque 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).

informação relacionada