Изменение расписания с помощью Schedule :: Cron

Я пишу сценарий на Perl, который должен запускаться в одно и то же время каждую ночь, за исключением того, что иногда это время нужно изменить. Я нашел Schedule :: Cron на CPAN, и он делает то, что я хочу делать. Согласно документации для метода запуска,

nofork = ›1

Не выполняйте форк при запуске планировщика. Вместо этого задания выполняются в текущем процессе. В ваших выполненных заданиях у вас есть полный доступ к глобальным переменным вашего скрипта и, следовательно, вы можете влиять на другие задания, выполняющиеся в другое время.

Это то, что я хочу делать, но этого не происходит. Всякий раз, когда я исследую место в памяти глобальных переменных, они остаются одинаковыми, но значение не изменяется при запуске задачи.

Я запускал это как в Windows, так и в Linux, и я попросил кого-то еще взглянуть на код, чтобы убедиться, что моя логика верна. Что мне нужно сделать, чтобы сохранить изменения глобальных переменных.

use warnings;
use strict;

use Schedule::Cron;
use Time::localtime;

use constant {
    EVERY_DAY_10PM => '* * * * * 4,16,28,40,52',
    EVERY_DAY_NOON => '* * * * * 0,12,24,36,48',
    EVERY_DAY_2AM => '* * * * * 7,19,31,43,55'
};

############GLOBAL VARIABLES############
our $cron = new Schedule::Cron(\&runUpdate);
our $cronId;
our $updateTimeDirty = 0;
############END GLOBAL VARIABLES############

############MAIN PROGRAM BODY############
$cronId = $cron->add_entry(EVERY_DAY_10PM);#defaults to \&runUpdate
$cron->add_entry(EVERY_DAY_NOON, \&changeTime);
$cron->run(no_fork => 1);
############END MAIN PROGRAM BODY############

sub changeTime {
    our $cron;
    our $cronId;
    our $updateTimeDirty;

    print "updateTimeDirty is $updateTimeDirty\n";
    print "udpateTimeDirty location: " . \$updateTimeDirty . "\n";
    print "cron object: " . \$cron . "\n";

    if ($updateTimeDirty) {
        my $cronEntry = $cron->get_entry($cronId);
        $cronEntry->{time} = EVERY_DAY_2AM;
        $cron->update_entry($cronId, $cronEntry);
    }
    print "\n";
}

sub runUpdate {
    our $updateTimeDirty;

    $updateTimeDirty = 1;
    print "Updating at " . localtime()->sec . " ($updateTimeDirty)\n\n";
}

person treed    schedule 27.01.2011    source источник


Ответы (1)


Есть существенная разница между no_fork и nofork. Пытаться:

$cron->run(nofork => 1);
person cjm    schedule 27.01.2011
comment
У меня тоже был ответ прямо в моем сообщении, когда я цитировал документацию. Спасибо. Это подчеркивание заставляло его разветвляться, поэтому я просто изменял копии переменных. - person treed; 27.01.2011