Я пишу сценарий в Perl, который нужно запускать в одно и то же время каждую ночь, за исключением того, что иногда это время нужно изменить. Я нашел Schedule::Cron на CPAN, и он делает то, что я хочу, чтобы он делал. В соответствии с документацией по методу выполнения,Изменение запланированного времени с расписанием :: Cron
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";
}
У меня также был ответ на мой пост, когда я привел документацию. Благодарю. Это подчеркивание вызывало его вилку, поэтому я просто модифицировал копии переменных. – treed
хорошо ловить! Делает сильный аргумент для более тщательной проверки параметров в модуле. – toolic