Jawaban Ignacio membuat saya penasaran, jadi saya melakukan riset dan membuat skrip Perl di bawah ini. Jika layanan Anda akan menulis ke pipa bernama itu harus berfungsi dan dapat digunakan dengan logrotate.
Agar bisa berfungsi, Anda perlu membuat file log Anda menjadi pipa bernama. Ganti nama file yang ada kemudian
mkfifo /var/log/something.log
dan untuk mengedit 3 nama file untuk memenuhi persyaratan Anda. Jalankan layanan Anda kemudian daemon ini yang harus membaca pipa bernama dan menulisnya ke file log baru.
Jika Anda mengubah nama /var/log/somethingrotateable.log
kemudian mengirim HUP ke daemon itu akan muncul sendiri dan membuat baru somethingrotateable.log
untuk menulis. Jika menggunakan logrotate, postrotate
skrip darikill -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;
}
}