2011-01-27 44 views
3

我正在用Perl編寫一個腳本,它需要在每天晚上的同一時間運行,有時候需要更改。我在CPAN上找到了Schedule::Cron,它做我想做的事情。根據文檔的運行方法,使用Schedule :: 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_forknofork之間有顯着性差異。嘗試:

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

當我引用文檔時,我的帖子中也有答案。謝謝。該下劃線導致它叉,所以我只是修改變量的副本。 – treed 2011-01-27 19:55:25