2010-09-27 3 views
4

Мне нужно запустить скрипт в первый рабочий день каждого месяца. Пожалуйста, предложите, как я могу это сделать в Perl.Как запустить скрипт в первый рабочий день каждого месяца?

Давайте скажем, если его национальный праздник в этой стране, сценарий должен работать на 2-й рабочий день. У меня есть один двоичный файл, который дает мне выход предыдущего рабочего дня, если его праздник для конкретной страны.

+3

можете ли вы расширить «выход предыдущего рабочего дня»? что он дает, если это не праздник? – ysth

+0

Сегодняшняя дата и вывод будут «101001» i.e.yearmonthdate, если я запускаю 1-й октябрь – user363638

+0

Не могли бы вы расширить «в этой стране»? Какие страны вас интересуют? – dolmen

ответ

7

Я предлагаю вам запустить ваш скрипт, используя cron один раз в день пн-пт.

Тогда ваш скрипт будет иметь начальный тест и выйти, если тест завершится с ошибкой.

Тест будет (псевдо-код):

if (isWeekend(today)) { 
    exit; 
} elsif (public_holiday(today)) { 
    exit; 
} 
for (day_of_month = 1; day_of_month < today; day_of_month++) { 
    next if (isWeekend(day_of_month)); 

    if (! public_holiday(day_of_month)) { 
     # a valid day earlier in the month wasn't a public holiday 
     # thus this script MUST have successfully run, so exit 
     exit; 
    } 
} 

# run script, because today is NOT the weekend, NOT a public holiday, and 
# no possible valid days for running exist earlier in this month 
1; 

Например, isWeekend функции может выглядеть следующим образом в Perl:

sub isWeekend { 
    my ($epoch_time) = @_; 

    my $day_of_week = (localtime($epoch_time))[6]; 
    return(1) if ($day_of_week == 0); # Sunday 
    return(1) if ($day_of_week == 6); # Saturday 
    return(0); 
} 

Вы должны написать свою собственную public_holiday функцию вернуть значение истины в зависимости от того, была ли дата государственным праздником в вашем конкретном государстве/стране.

+0

Но, скажем, понедельник не было ни праздником, ни выходным, и он побежал .. но как предотвратить бег во вторник. – user363638

+1

Он не будет работать во вторник, потому что вышеприведенный код обнаружит, что понедельник был действительным днем, а затем вышел. Прочитайте псевдо-код выше. –

7

В пакете CPAN Date::Manip есть все, что нужно для поддержки такого рода вещей. 'Date_NextWorkDay()' выглядит наиболее подходящим для вас.

Смежные вопросы