tail -f sem o rabo?

5

Existe um comando no Solaris para ler um arquivo e quando ele chega ao fim para transmitir como a cauda faz? Eu preciso ler o arquivo desde o início, e é um arquivo binário.

Informações sobre Solaris e Linux serão apreciadas.

    
por George Bailey 07.01.2012 / 16:17

2 respostas

5

tail -9999f fará algo próximo do que você deseja. Adicione mais 9s se o seu arquivo for maior.

Problemas:

  1. Arquivos binários podem não ter caracteres de nova linha. tail -f esperará por uma nova linha antes de imprimir qualquer coisa.
  2. A versão de tail no Solaris (você não mencionou qual Solaris, mas provavelmente não importa) provavelmente não suporta essa opção. Pode suportar tail -n 9999 -f . Você pode ter que adquirir a versão GNU da cauda.
  3. Como o arquivo está em constante crescimento, existe uma condição de corrida entre descobrir o quão grande é e iniciar o processo final. Você pode perder o início do arquivo se não pedir linhas suficientes.
  4. tail não saberá quando você realmente terminou de gravar no arquivo, portanto, o processo gzip nunca terminará. Não tenho certeza do que acontecerá quando você ctrl-c terminar o processo tail , mas é provável que o gzip limpe depois de si mesmo e remova o arquivo em que estava trabalhando.

Minha sugestão seria iniciar o programa original e canalizar a saída para o gzip assim:

./my_program | gunzip > new_file.txt

Dessa forma, o gunzip esperará se my_program estiver lento, mas ainda terminará quando o verdadeiro final do arquivo for indicado por my_program acabamento.

Você pode precisar reescrever seu programa para gravar em STDOUT em vez de diretamente em um arquivo.

Editar:

Depois de dar uma olhada na página do manual , três dos problemas acima podem ser resolvidos. Usar a opção -c <bytes> em vez de -n <lines> atenua o problema 1. Usar -n +0 ou -c +0 atenua o problema 3. O uso de --pid=<PID> terminará quando o programa original (em execução como <PID> ) terminar, o que atenua o problema 4.

    
por 07.01.2012 / 17:09
12

No linux você pode usar tail -f -n +0 /path/filename para vê-lo. Enquanto -n geralmente refere-se a quantas linhas no final do arquivo que você deseja imprimir, quando passado +<n> ele inicia na enésima linha desde o início do arquivo.

De tail --help :

-n, --lines=K            output the last K lines, instead of the last 10;
                         or use -n +K to output lines starting with the Kth
    
por 07.01.2012 / 17:40