Schedule::Cron을 사용하여 Perl에서 데몬 생성

9468 단어 perl
Adaemon는 무기한 백그라운드에서 실행되는 프로그램입니다.

Unix 계열 운영 체제에서 중요한 데몬은 주기적으로 작업을 수행하도록 구성할 수 있는 cron scheduler입니다. 다양한 유형의 데몬이 있지만 cron 데몬을 만드는 방법을 살펴보겠습니다.

데몬을 만들기 위해 내가 가장 좋아하는 CPAN 모듈은 Schedule::Cron 입니다. 이를 통해 미리 구성된 간격으로 Perl 서브루틴을 디스패치하는 데몬을 만들 수 있습니다. 내가 Schedule::Cron을 좋아하는 이유는 배우기 쉽고 이해하기 쉽고 작동하기 때문입니다.

이 기사는 Schedule::Cron이 할 수 있는 모든 것에 대한 완전한 개요가 아니므로 나중에 공식 문서를 읽어보십시오.

간단한 데몬



5분마다 현재 시간을 기록하고 매시간 로그 파일을 회전하면서 최대 4개의 오래된 로그를 유지하는 간단한(그리고 쓸모없는) 데몬을 작성해 봅시다. 현재 로그 파일의 이름은 $HOME/times.txt 이고 이전 로그 파일의 이름은 $HOME/times.txt.{1,2,3,4} 입니다.

먼저 현재 로그 파일에 시간을 쓰는 함수가 필요합니다.

sub append_time {
    my $logfile = "$ENV{HOME}/times.txt";
    open my $fh, '>>', $logfile or die "cannot open file '$logfile': $!";
    my $time = localtime();
    print $fh "$time\n";
    close $fh;
}


다음으로 이전 로그 파일을 회전하는 기능이 필요합니다.

use File::Copy 'move';

sub rotate_time_log {
    my $logfile      = "$ENV{HOME}/times.txt";
    my @old_logfiles = grep /^$ENV{HOME}\/times\.txt\.\d+$/, glob "$ENV{HOME}/*";
    # We don't need to rotate unless we have more than 4 old logfiles
    return if @old_logfiles <= 4;
    unlink "$logfile.4";
    for (my $i = 3; $i >= 1; $i--) {
        move $old_logfiles[$i], $logfile.$i+1;
    }
    move $logfile, "$logfile.1";
}


이러한 기능이 작동하는 방식을 이해하는 것은 Schedule::Cron 에 대해 배우는 데 중요하지 않습니다.

이제 시간 로깅 기능이 있으므로 데몬 개체를 초기화하겠습니다. 데몬 개체를 초기화하기 위해 Schedule::Cron::new 함수를 사용합니다.

Schedule::Cron::new의 첫 번째 인수는 실행할 함수를 지정하지 않고 cron 항목을 추가하는 경우 기본값으로 사용될 서브루틴에 대한 참조여야 합니다. 데몬이 실행하기를 원하는 기능이 하나뿐인 경우에만 유용합니다. 우리는 이 기능을 사용하지 않을 것이므로 프로그램을 죽이는 기능으로 설정했습니다.

Schedule::Cron::new에 전달할 수 있는 많은 옵션이 있습니다. 우리가 사용할 유일한 옵션은 데몬 프로세스의 이름에 접두사를 지정하는 데 사용되는 processprefix입니다.

use Schedule::Cron;

my $cron_daemon = Schedule::Cron->new(
    sub { die "time-daemon: error: default Schedule::Cron function was called\n" },
    processprefix => 'time-daemon'
);


가장 중요한 Schedule::Cron 메서드는 add_entry 이며 cron 문자열과 코드 참조를 사용합니다. 데몬을 실행하면 cron 문자열에 지정된 간격으로 코드 참조가 실행되도록 예약됩니다.

개인적으로 cron 문자열의 구문을 기억할 수 없습니다. 내 cron 문자열의 의미에 대한 영어 번역을 얻기 위해 웹 사이트crontab.guru를 사용하여 내 cron 문자열을 쉽게 구축할 수 있습니다.
&append_time 서브루틴이 5분마다 실행되도록 예약하고 &rotate_time_log 서브루틴이 매시간 실행되도록 예약합니다.

$cron_daemon->add_entry(
    '*/5 * * * *',
    \&append_time
);

$cron_daemon->add_entry(
    '0 */1 * * *',
    \&rotate_time_log
);


이제 Schedule::Cron::run 메서드를 사용하여 데몬을 시작할 준비가 되었습니다. 이 방법에는 많은 옵션이 있지만 우리가 사용할 유일한 옵션은 detach 입니다. 이로 인해 데몬 프로세스가 현재 프로세스에서 분리됩니다.

my $pid = $cron_daemon->run(detach => 1);

print "started the time-daemon as pid $pid\n";


그게 전부입니다! 따라야 할 기본 방법은 다음과 같습니다. Schedule::Cron 개체를 초기화하고 add_entry으로 실행할 서브루틴을 예약한 다음 run 메서드로 데몬을 시작합니다.

좋은 웹페이지 즐겨찾기