2011-01-27 1 views
3

Я пишу сценарий в 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"; 
} 

ответ

7

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

$cron->run(nofork => 1); 
+1

У меня также был ответ на мой пост, когда я привел документацию. Благодарю. Это подчеркивание вызывало его вилку, поэтому я просто модифицировал копии переменных. – treed

+1

хорошо ловить! Делает сильный аргумент для более тщательной проверки параметров в модуле. – toolic