Câu trả lời của Ignacio khiến tôi tò mò nên tôi đã thực hiện một số nghiên cứu và đưa ra kịch bản Perl bên dưới. Nếu dịch vụ của bạn sẽ ghi vào một đường ống có tên, nó sẽ hoạt động và có thể sử dụng được với logrotate.
Để nó hoạt động, bạn cần làm cho logfile của bạn thành một ống có tên. Đổi tên tập tin hiện có sau đó
mkfifo /var/log/something.log
và để chỉnh sửa 3 tên tệp để đáp ứng yêu cầu của bạn. Chạy dịch vụ của bạn sau đó daemon này sẽ đọc đường ống được đặt tên và ghi nó vào một logfile mới.
Nếu bạn đổi tên /var/log/somethingrotateable.log
thì gửi HUP tới daemon, nó sẽ tự sinh ra và tạo một cái mới somethingrotateable.log
để viết. Nếu sử dụng logrotate một postrotate
tập lệnh củakill -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;
}
}