Re: More on perl like tail
Jim Gibson writes: > At 3:57 PM -0500 10/24/09, Harry Putnam wrote: >>Sorry about being tricky with what was an older thread. But I suspect >>that thread died... and no one noticed there was an unaswered question >>still there. > Or no one knew the answer. He he... unlikely here I think.. [...] > I would modify the above a little. You are calling eof after each > line, which is unnecessary. The input operator will return > undef whenever eof will return true, so calling eof is redundant. You > can make this a little more efficient with something like the > following (untested): > > while(1) { > while() { > print; > } > sleep 1; > seek(FILE,0,1); > } > That does look like it might be better... and thanks for the explanation. [...] >> >> use File::Tail; >> $file=File::Tail->new("/some/log/file"); >> while (defined($line=$file->read)) { >> print "$line"; >> } > > That looks OK, and works for me on /var/log/system.log, although the > delays are longer using File::Tail than Unix tail. Maybe you should That isn't actually the version I used .. its a bit lower on the page you cited above... but I can't see anything that make it work any different. cat fltr_sl [...] use File::Tail; my ($file,$line); my $fname_in = "/var/adm/slpipe"; $file=File::Tail->new("$fname_in"); while (defined($line=$file->read)) { print "$line"; } > try it on a normal file that you write to occasionally with another > Perl program. One question, in your test you didn't actually run it against a named-pipe did you? Would that be likely to make a difference? Taking your suggestion I see the script above will ouput from a normal file. touch t1 ./filterWithFileTail.pl (edited to open ./t1) while [[ 1 ]];do echo "Now you've done it" >> t1 sleep 1 cat ~/.bash_history >> t1 sleep 1 done The File::Tail filter does eventually output the data coming in. You mentioned it's slower.. it seems a good bit slower here. But it will NOT ouput data from the named pipe. I ran the same while loop writing to the named pipe and still the perl filter with File::Tail won't output a thing. Anyway I have a working script... soon to modify with your suggestions. .. thanks for the help. -- To unsubscribe, e-mail: beginners-unsubscr...@perl.org For additional commands, e-mail: beginners-h...@perl.org http://learn.perl.org/
Re: More on perl like tail
At 3:57 PM -0500 10/24/09, Harry Putnam wrote: Sorry about being tricky with what was an older thread. But I suspect that thread died... and no one noticed there was an unaswered question still there. Or no one knew the answer. Shawn C originally suggested I use File::Tail. There was a short exchange about why and then I began trying to use File::Tail but haven't been successful with it. The details are below: Shawn H Corey writes: open(FILE,"<./named-pipe") or die "Can't Open ./named-pipe: $!"; while(){ print; if(eof){ sleep 2; seek (FILE,0,1); } } I would modify the above a little. You are calling eof after each line, which is unnecessary. The input operator will return undef whenever eof will return true, so calling eof is redundant. You can make this a little more efficient with something like the following (untested): while(1) { while() { print; } sleep 1; seek(FILE,0,1); } >> In this case, the above code is a kludge. You can tell this because the program sleeps, rather than waiting on input. When a program does something to emulate what it really should be doing, it introduces code that may not work in all cases. I'm having trouble with File::Tail... or more likely the way I'm trying to use it is wrongly setup. But first about that sleep comment. As I read a little of File::Tail and its very likely I'm not really understanding what I'm reading but, it appears to be saying that it `sleeps' at times... the times are a little more sophisticated... but none the less sleep. I do not agree with that "kludge" comment. When waiting for slow events, you can either use "polling" or "interrupts". Polling means continually sleeping and then checking if the event has occurred. The event in this case is additional data appearing at the end of the file. Interrupt would mean blocking until the event has occurred. That can be accomplished using the Unix select statement. In the general case, interrupts are more efficient than polling, because your process does not execute at all until the event occurs. In this case, however, your process is waiting on another, slower process: the file writer. If you were to use a select statement, at the cost of increased complexity in your program, you would respond faster to new data. However, sleeping for 1 second and trying to read the file is not going to put a large load on your system. So the simple method using sleep will cost you less than one second every time you exhaust the file input in your reader process. If this is acceptable, then using sleep is OK. File::Tail does have a select method to improve response, but I think that in most cases that is overkill. As you have pointed out, the normal use of File::Tail involves calling the sleep function. Now the problem. I've taken the first examples in the perldoc File::Tail output: (http://search.cpan.org/~mgrabnar/File-Tail-0.99.3/Tail.pm) use File::Tail; $file=File::Tail->new("/some/log/file"); while (defined($line=$file->read)) { print "$line"; } That looks OK, and works for me on /var/log/system.log, although the delays are longer using File::Tail than Unix tail. Maybe you should try it on a normal file that you write to occasionally with another Perl program. -- To unsubscribe, e-mail: beginners-unsubscr...@perl.org For additional commands, e-mail: beginners-h...@perl.org http://learn.perl.org/
More on perl like tail
Sorry about being tricky with what was an older thread. But I suspect that thread died... and no one noticed there was an unaswered question still there. Shawn C originally suggested I use File::Tail. There was a short exchange about why and then I began trying to use File::Tail but haven't been successful with it. The details are below: > Shawn H Corey writes: > >>> open(FILE,"<./named-pipe") or die "Can't Open ./named-pipe: $!"; >>> while(){ >>> print; >>> if(eof){ >>> sleep 2; >>> seek (FILE,0,1); >>> } >>> } >>> >>> It seems at least to survive repeated restarts of system logger. >>> >>> If I write my script based on this code... what I'd be adding would be >>> code to get 1 or 2 rgx from the cmdline, then write the hits to >>> various files. > > [...] > >> In the general case, modules usually take care of special cases that you >> may not be aware of. That makes them the preferred method of solving a >> problem. >> >> In this case, the above code is a kludge. You can tell this because the >> program sleeps, rather than waiting on input. When a program does >> something to emulate what it really should be doing, it introduces code >> that may not work in all cases. I'm having trouble with File::Tail... or more likely the way I'm trying to use it is wrongly setup. But first about that sleep comment. As I read a little of File::Tail and its very likely I'm not really understanding what I'm reading but, it appears to be saying that it `sleeps' at times... the times are a little more sophisticated... but none the less sleep. Now the problem. I've taken the first examples in the perldoc File::Tail output: (http://search.cpan.org/~mgrabnar/File-Tail-0.99.3/Tail.pm) use File::Tail; $file=File::Tail->new("/some/log/file"); while (defined($line=$file->read)) { print "$line"; } And tied to make it work for my case (/var/adm/slpipe in the script is a named-pipe that the system logger reads into): cat fltr_sl #!/usr/local/bin/perl use strict; use warnings; use File::Tail; my ($file,$line); my $fname_in = "/var/adm/slpipe"; $file=File::Tail->new("$fname_in"); while (defined($line=$file->read)) { print "$line"; } When I run it, it doesn't show any errors, and appears to be waiting on the pipe. But no data ever comes out. I used the same test sequence as for the earlier script that didn't use File::Tail (posted earlier in this thread). The sequence is. 1) start the script `fltr_sl' shown above 2) To make sure if data is flowing thru the pipe start start (in a different xterm) tail -f slpipe too. 2) kill -HUP the system logger. 3) Ensure some data is flowing thru the named-pipe by running ssh r...@localhost from a user account I see 7-8 lines output to the tail -f slpipe command, but nothing to the perl script fltr_sl. And as I write this message, quite a few more lines are appearing at the `tail -f slpipe' cmd, but still nothing at my perl filter. Have I made some serious mistake in my attempted usage of File::Tail? -- To unsubscribe, e-mail: beginners-unsubscr...@perl.org For additional commands, e-mail: beginners-h...@perl.org http://learn.perl.org/