What is happening is that once a file has been opened, the handle points 
to the "inode" which is an internal "number". This "number" is unique for 
a filesystem and identifies the file regardless of its "name" in the 
directory. That is why your Perl program is "following" the "old name". 
Anyway,

What you need to do is create an entry in /etc/logrotate.d. Look at one of 
the entries in there for an example of how to code it. Oh, I think you've 
already done this.

What your Perl program needs to do is:

1) write its PID to a known location. Many put this is /var/run. Something 
like:

open (PIDFILE,">/var/run/myPerlScript.pid") or die "cannot open pid file 
$!";
print PIDFILE "$$";
close(PIDFILE);
...

2) Determine the "signal" that you want logrotate to issue to tell your 
script to reopen its log file. Many programs use the HUP signal. Create a 
signal handler in your Perl program to field this signal to close and 
reopen its log file. This is the main "magic" to get this working. I'd 
make LOGHANDLE an "our" variable at the top of the Perl program. Replace 
LOGHANDLE with the correct variable, of course <grin>.

$SIG{HUP} = sub {
        close(LOGHANDLE);
        open(LOGHANDLE,">/var/log/myPerlScript.log") or die "cannot open 
logfile $!";
        };

3) Create the aforementioned logrotate entry in /etc/logrotate.d something 
like:

/var/log/myPerlScript.log {
        notifempty
        missingok
        postrotate
                /usr/bin/kill -HUP `cat /var/run/myPerlScript.pid 
>/dev/null` 2>/dev/null || true
        endscript
}

perhaps calling it "myPerlScript.log". Note - replace "myPerlScript" with 
the actual name of your Perl script. Note that when the signal handler 
actually executes, the previous myPerlScript.log file has already been 
renamed, so the open in the signal handler create a new file with the old 
name.


On Thu, 29 Jan 2004, TeamSolCO wrote:

>     I have written a long running perl application to help me with some 
> trivial administrative functions.  Due to the
> volume of logging generated by this application, I am managing its 
> output with logrotate.  The problem I face is that
> perl is "following" the log files that logrotate swaps out.  While this 
> is probably intelligent on perl's part (to
> follow the file descriptor rather than the file name), it is presenting 
> a major problem for me.  When "logfile" becomes
> "logfile.1" (etc), my application follows that move and "continues" 
> logging to the new "logfile.1" instead of losing
> that file handle -- a condition which I check for so that I can reopen 
> the log file using the proper file name,
> "logfile".
>     Ultimately, perl will only lose the file handle when logrotate 
> finally deletes the "last file" in the log rotation
> scheme.  Unfortunately, I will have lost a week's worth of logs 
> because all that data will have been in the single file.
> Additionally, I'll have several empty log file copies named .1, .2, .3, 
> etc.  How can I set perl to NOT follow the file
> when it is renamed by logrotate, such that a condition will be created 
> where I will be able to initialize the
> replacement file?
> 
> Thanks!!
> 
> - William Kimball
>   "Programming is an art-form that fights back!"
> 

--
Maranatha!
John McKown


-- 
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]
<http://learn.perl.org/> <http://learn.perl.org/first-response>


Reply via email to