[Cascavel-pm] Simulando tail -f
Wendel Scardua
wendelscardua em gmail.com
Segunda Outubro 8 14:20:32 PDT 2007
Não olhei direito o código, mas me parece que falta fazer um $pos = 0; na
hora em que você abre o arquivo novamente...
[]s
Wendel
On 10/8/07, Arthur Renato Mello <farinha.ufpr em gmail.com> wrote:
>
> Ola Monges,
>
> tenho o seguinte problema: Preciso simular um tail -f em um arquivo de
> log. Mas com uma funcionalidade a mais, o arquivo pode mudar de nome
> durante o processo (logrotate). Ou seja, eu comeco a monitorar o
> arquivo "log.txt", apos um tempo o logrotate executa e o arquivo eh
> renomeado para "log-old.txt", e um novo log.txt eh criado. O script
> precisa esquecer o "log-old.txt" (antigo log.txt que ja esta aberto) e
> comecar a monitorar o novo log.txt.
>
> Um agravante eh que quem solicitou nao gostaria de utilizar nenhum
> modulo do CPAN, apenas o que for built in da linguagem.
>
> Eu utilizei um codigo do perl FAQ que mostra como simular tail -f, e
> acrescentei uma verificacao de inode (usando stat). Caso o inode do
> arquivo com mesmo nome, seja diferente do que eu estou usando eu
> preciso reabrir o arquivo.
>
> O codigo funciona (esta colado no final). Porem eu estou perdendo as
> primeiras linhas do "arquivo novo", a impressao eh que o comando tell,
> utilizado no for de leitura soh comeca a fazer efeito quando o tamanho
> do arquivo novo, passa o tamanaho do antigo. Algo como se o fdescritor
> de arquivo estivesse apontando para uma posicao em bytes qqr e so
> fosse comecara ler dali pra frente. Se isto estiver certo gostaria de
> alguma ideia de como fazer esse apontador voltar pro comeco do
> arquivo.
>
> Espero ter me feito entender :). Desde jah agradeco sugestoes de
> solucoes ou novas abordagens:
>
> ==============================================
> #!/usr/bin/perl
>
> use strict;
> use warnings;
> #use Fcntl qw(:seek);
>
> sub usage{
> print("USAGE: $0 <LOGFILE>\n");
> exit(1);
> }
>
> (@ARGV != 1) and usage();
>
> (my $filename) = @ARGV;
>
> open(LOG, $filename) or die "Unable to open $filename: $!";
>
> my @old_file;
> my @new_file;
>
> @old_file = stat($filename);
>
> my $w_time = 1;
> my $pos;
>
> my $count = 0;
> my $changed = 0;
> my $test_file_interval = 10;
>
> while(1){
> $pos = 0;
>
> for($pos = tell(LOG); $_ = <LOG>; $pos = tell(LOG)){
> print;
> }
>
> if($changed){
> $changed = 0;
>
> close(LOG);
>
> while(! -r $filename){
> sleep($w_time);
> }
>
> open(LOG, $filename);
> }
>
> if($count == $test_file_interval){
> $count = 0;
>
> @new_file = stat($filename);
> if(!defined($new_file[1]) or $old_file[1] != $new_file[1]){
> $changed = 1;
> }
> }
>
> sleep($w_time);
> seek(LOG, $pos, 0);
>
> $count++;
> }
> ==============================================
>
> []s
> Arthur
> ___________________________________________
-------------- Próxima Parte ----------
Um anexo em HTML foi limpo...
URL: http://mail.pm.org/pipermail/cascavel-pm/attachments/20071008/91d8cdfc/attachment.html
Mais detalhes sobre a lista de discussão Cascavel-pm