Die Antwort von Ignacio hat mich fasziniert, also habe ich ein paar Nachforschungen angestellt und das Perl-Skript unten entwickelt. Wenn Ihr Dienst in eine Named Pipe schreibt, sollte er funktionieren und mit Logrotate verwendet werden können.
Damit dies funktioniert, müssen Sie Ihre Protokolldatei in eine Named Pipe umwandeln. Benennen Sie dann die vorhandene Datei um
mkfifo /var/log/something.log
und die 3 Dateinamen zu bearbeiten, um Ihre Anforderungen zu erfüllen. Führen Sie Ihren Dienst dann diesen Daemon aus, der die Named Pipe lesen und in eine neue Protokolldatei schreiben soll.
Wenn Sie umbenennen /var/log/somethingrotateable.log
, wird ein HUP an den Daemon gesendet, der sich selbst erzeugt und ein neues erstellt, somethingrotateable.log
in das geschrieben werden kann. Wenn Sie logrotate verwenden, schreiben Sie ein postrotate
Skript vonkill -HUP 'cat /var/run/yourpidfile.pid'
#!/usr/bin/perl -w
use POSIX ();
use FindBin ();
use File::Basename ();
use File::Spec::Functions;
#
$|=1;
#
# Change the 3 filenames and paths below to meet your requirements.
#
my $FiFoFile = '/var/log/something.log';
my $LogFile = '/var/log/somethingrotateable.log';
my $PidFile = '/var/run/yourpidfile.pid';
# # make the daemon cross-platform, so exec always calls the script
# # itself with the right path, no matter how the script was invoked.
my $script = File::Basename::basename($0);
my $SELF = catfile $FindBin::Bin, $script;
#
# # POSIX unmasks the sigprocmask properly
my $sigset = POSIX::SigSet->new();
my $action = POSIX::SigAction->new('sigHUP_handler',$sigset,&POSIX::SA_NODEFER);
POSIX::sigaction(&POSIX::SIGHUP, $action);
sub sigHUP_handler {
# print "Got SIGHUP";
exec($SELF, @ARGV) or die "Couldn't restart: $!\n";
}
#open the logfile to write to
open(LOGFILE, ">>$LogFile") or die "Can't open $LogFile";
open(PIDFILE, ">$PidFile") or die "Can't open PID File $PidFile";
print PIDFILE "$$\n";
close PIDFILE;
readLog();
sub readLog {
sysopen(FIFO, $FiFoFile,0) or die "Can't open $FiFoFile";
while ( my $LogLine = <FIFO>) {
print LOGFILE $LogLine;
}
}