Article 3615 of comp.lang.perl: Xref: feenix.metronet.com comp.lang.perl:3615 Newsgroups: comp.lang.perl Path: feenix.metronet.com!news.utdallas.edu!corpgate!bnr.co.uk!pipex!unipalm!ian From: ian@unipalm.co.uk (Ian Phillipps) Subject: Re: tail -f clone in perl? Message-ID: <1993Jun22.142450.11916@unipalm.co.uk> Organization: Unipalm Ltd., 216 Cambridge Science Park, Cambridge CB4 4WA, UK References: <1993Jun22.121619.14881@rcvie.co.at> Date: Tue, 22 Jun 1993 14:24:50 GMT Lines: 45 cc_paul@rcvie.co.at (Wolf Paul) writes: >I need to write a script which monitors several files and >collects lines added to these files into a single output >stream... >Can I have a file open and attempt a read, and just try >again later if I get EOF, or will that not work? I found it neccessary to remember the size and seek there each time, otherwise I got core dumps. Probably a problem in stdio. Your milage may vary. >Any hints, or a working tail -f clone, would be appreciated. I hacked this in a few minutes a while ago as a sort of challenge. It's not as sophisticated as the real "ntail" (qv via archie) but does the job. It would probably be better not to keep opening the files... #!/usr/local/bin/perl while($_=shift) { if (-d $_ ) { push( @ARGV, <$_/*> ); next; } (warn "Can't read $_: $!\n", next ) unless -r; $length{$_} = -s _; push( @files, $_ ); } while(1) { file: for $file (@files) { open( I, $file ) || next file; seek( I, $length{$file}, 0 ); print while $_=; $length{$file} = tell I; } sleep 1; } -- Ian Phillipps, Unipalm Ltd, 216 Science Park, Phone +44 223 250100 Milton Road, Cambridge, CB4 4WA, England. Phax +44 223 250101 PIPEX Ltd. is a wholly-owned subsidiary of Unipalm Ltd. - phone 0223 250120