Salientando um novo arquivo com um nome antigo [duplicado]

1
    

Esta pergunta já tem uma resposta aqui:

    

Isto é ao longo das linhas de Como começar a seguir um arquivo que ainda não foi criado com uma torção: um arquivo com o nome já existe.

Eu tenho um programa que é executado várias vezes; quando o nome do arquivo de saída já estiver em uso, ele renomeia o arquivo existente inserindo _XYZ antes da extensão do arquivo, em que XYZ é o menor inteiro ( por exemplo, output.out se torna 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 citar o nome principal, mesmo com -F , ele começa a rastrear o arquivo existente imediatamente e retém o identificador para esse inode mesmo quando o arquivo é renomeado, ignorando o novo arquivo.

O programa é executado em um cluster compartilhado com gerenciamento de filas, portanto, a execução começa com & defasagens variáveis.

É possível acompanhar o novo arquivo sem esperar que ele seja criado primeiro? Se sim, como?

    
por Ghillie Dhu 01.05.2013 / 19:18

1 resposta

2

tail -F já deve fazer isso.

Crie um /tmp/t/file vazio. Em seguida, no terminal 1, inicie tail -F e deixe-o em execução:

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 realmente segue o nome, não o inode. Talvez você esteja usando um tail que dê um significado diferente a -F (esse sinalizador é uma extensão BSD, copiada posteriormente pelo GNU também), ou sua versão tem bugs? Você também pode tentar tail --follow=name --retry (sintaxe alternativa de cauda GNU) ou xtail (que coroa um diretório inteiro).

    
por 01.05.2013 / 19:33

Tags