La réponse d'Ignacio m'a intrigué alors j'ai fait quelques recherches et j'ai trouvé le script Perl ci-dessous. Si votre service écrit sur un canal nommé, il devrait fonctionner et être utilisable avec logrotate.
Pour que cela fonctionne, vous devez transformer votre fichier journal en un canal nommé. Renommez le fichier existant puis
mkfifo /var/log/something.log
et de modifier les 3 noms de fichiers pour répondre à vos besoins. Exécutez votre service puis ce démon qui doit lire le canal nommé et l'écrire dans un nouveau fichier journal.
Si vous renommez /var/log/somethingrotateable.log
puis envoyez un HUP au démon, il se reproduira et en créera un nouveau somethingrotateable.log
pour écrire. Si vous utilisez logrotate, un postrotate
script dekill -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;
}
}