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...<br><br>[]s<br>Wendel<br><br><div><span class="gmail_quote">On 10/8/07, <b class="gmail_sendername">Arthur Renato Mello
</b> <<a href="mailto:farinha.ufpr@gmail.com">farinha.ufpr@gmail.com</a>> wrote:</span><blockquote class="gmail_quote" style="border-left: 1px solid rgb(204, 204, 204); margin: 0pt 0pt 0pt 0.8ex; padding-left: 1ex;">
Ola Monges,<br><br>tenho o seguinte problema: Preciso simular um tail -f em um arquivo de<br>log. Mas com uma funcionalidade a mais, o arquivo pode mudar de nome<br>durante o processo (logrotate). Ou seja, eu comeco a monitorar o
<br>arquivo "log.txt", apos um tempo o logrotate executa e o arquivo eh<br>renomeado para "log-old.txt", e um novo log.txt eh criado. O script<br>precisa esquecer o "log-old.txt" (antigo log.txt
que ja esta aberto) e<br>comecar a monitorar o novo log.txt.<br><br>Um agravante eh que quem solicitou nao gostaria de utilizar nenhum<br>modulo do CPAN, apenas o que for built in da linguagem.<br><br>Eu utilizei um codigo do perl FAQ que mostra como simular tail -f, e
<br>acrescentei uma verificacao de inode (usando stat). Caso o inode do<br>arquivo com mesmo nome, seja diferente do que eu estou usando eu<br>preciso reabrir o arquivo.<br><br>O codigo funciona (esta colado no final). Porem eu estou perdendo as
<br>primeiras linhas do "arquivo novo", a impressao eh que o comando tell,<br>utilizado no for de leitura soh comeca a fazer efeito quando o tamanho<br>do arquivo novo, passa o tamanaho do antigo. Algo como se o fdescritor
<br>de arquivo estivesse apontando para uma posicao em bytes qqr e so<br>fosse comecara ler dali pra frente. Se isto estiver certo gostaria de<br>alguma ideia de como fazer esse apontador voltar pro comeco do<br>arquivo.<br>
<br>Espero ter me feito entender :). Desde jah agradeco sugestoes de<br>solucoes ou novas abordagens:<br><br>==============================================<br>#!/usr/bin/perl<br><br>use strict;<br>use warnings;<br>#use Fcntl qw(:seek);
<br><br>sub usage{<br> print("USAGE: $0 <LOGFILE>\n");<br> exit(1);<br>}<br><br>(@ARGV != 1) and usage();<br><br>(my $filename) = @ARGV;<br><br>open(LOG, $filename) or die "Unable to open $filename: $!";
<br><br>my @old_file;<br>my @new_file;<br><br>@old_file = stat($filename);<br><br>my $w_time = 1;<br>my $pos;<br><br>my $count = 0;<br>my $changed = 0;<br>my $test_file_interval = 10;<br><br>while(1){<br> $pos = 0;<br>
<br> for($pos = tell(LOG); $_ = <LOG>; $pos = tell(LOG)){<br> print;<br> }<br><br> if($changed){<br> $changed = 0;<br><br> close(LOG);<br><br> while(! -r $filename){<br> sleep($w_time);
<br> }<br><br> open(LOG, $filename);<br> }<br><br> if($count == $test_file_interval){<br> $count = 0;<br><br> @new_file = stat($filename);<br> if(!defined($new_file[1]) or $old_file[1] != $new_file[1]){
<br> $changed = 1;<br> }<br> }<br><br> sleep($w_time);<br> seek(LOG, $pos, 0);<br><br> $count++;<br>}<br> ==============================================<br><br>[]s<br>Arthur<br>___________________________________________
</blockquote></div>