3 주마다 작업을 실행하는 크론 작업을 만들려면 어떻게해야합니까?


9

프로젝트 일정 (3 주)으로 수행해야 할 작업이 있습니다.

매주 3 주마 다이 작업 을 수행하도록 cron 을 설정할 수 있지만 3 주마 다이 작업을 수행 할 수있는 방법을 찾을 수 없습니다.

스크립트를 해킹하여 임시 파일 (또는 유사한 파일)을 만들 수 있으므로 세 번째로 실행 된 것으로 해결할 수는 있지만이 솔루션은 냄새가납니다.

깨끗하게 할 수 있습니까?


@itj 3 주 = 21 일이므로 21 일마다 cron 작업을하지 마십시오.
Studer

1
내가 뭔가를 놓친 수도 있지만, 내가 생각하지 않았다 @studer crontab을했다 그 유연성
itj

답변:


8

crontab 파일은 다음 만 지정할 수 있습니다.

minute (0-59)
hour (0-23)
day of the month (1-31)
month of the year (1-12)
day of the week (0-6 with 0=Sunday)

따라서 어떤 주를 적용해야하는지 지정할 수 없습니다.

래퍼 스크립트를 작성하는 것이 가장 좋습니다.
쉘 스크립트에서 주 번호를 얻을 수 있습니다.

date +%U

또는

date +%V

일요일 또는 월요일에 주를 시작할 것인지를 결정합니다.
그래서 당신은 사용할 수 있습니다

week=$(date +%V)
check=$(( ($week - 1) % 3 ))

그리고 $ check는 일년의 1, 4, 7 주에 0이됩니다.


3
연말은 어떻게됩니까? 1 년이 3주의 배수로 균등하게 분할되지 않기 때문에 추가 시간이 걸리거나 일주일 등을 건너 뛰나요?
davr

대답 해줘서 고마워요. 내가 생각했던 것보다 더 깔끔합니다. 1 년 동안 만 유효하지만 대부분의 프로젝트에는 정상입니다.
itj

여러 해에 걸쳐, 크리스마스와 1 월 1 일 사이에 8 일 또는 9 일 간격으로 두 번의 간격을 두게되므로, 3 주를 계산할 수 있도록 적절하게 수행하고 "마지막 실행 날짜"를 기록해야 할 때입니다. 간격.
njd

3

이전 답변 덕분에 획기적인 옵션에서 날짜 -e 또는 % s 형식

조금 고통 스럽지만 ((date +%s) / 86400)신기원부터 며칠이 걸립니다.

동시에 실행되는 주간 작업에 의존하여 3 주 동안 특정 날짜에 대해이를 쉽게 점검 할 수 있습니다 ( $epoch_day%21 == 13예 :).

제 경우에는 원샷 작업이므로 괜찮습니다. 특정 날짜에 놓치면 다음 기회에 실행할 필요가 없습니다.


1

실행간에 타임 스탬프 파일을 저장할 수있는 경우 현재 날짜에만 의존하지 않고 해당 파일의 날짜를 확인할 수 있습니다.

귀하의 경우 찾기 명령에 대한 분수 값을 지원 -mtime(또는 있습니다 -mmin) ( GNU의 발견은 모두 가지고 , POSIX 중 하나를 필요로하지 않는 것 ), 당신이 할 수와 '스로틀'은 cron 작업에 발견 하고 터치 .

또는 파일 날짜를 "epoch 이후의 초"(예 : Gnu coreutils의 통계 , 기타 구현) 로 표시 하는 stat 명령 이있는 경우 date , stat 및 셸 비교 연산자를 사용하여 직접 비교할 수 있습니다 ( 와 터치 ) 타임 스탬프 파일을 업데이트합니다. 포맷팅이 가능한 경우 stat 대신 ls 를 사용할 수도 있습니다 (예 : GNU fileutils의 ls ).

아래는 n-hours-ago타임 스탬프 파일을 업데이트하고 원래 타임 스탬프가 충분히 오래된 경우 성공적으로 종료 되는 Perl 프로그램 입니다. 사용법 텍스트는 crontab 항목에서이를 사용하여 cron 작업을 조절하는 방법을 보여줍니다. 또한 "일광 절약"에 대한 조정 및 이전 실행에서 '늦은'타임 스탬프를 처리하는 방법에 대해서도 설명합니다.

#!/usr/bin/perl
use warnings;
use strict;
sub usage {
    printf STDERR <<EOU, $0;
usage: %s <hours> <file>

    If entry at pathname <file> was modified at least <hours> hours
    ago, update its modification time and exit with an exit code of
    0. Otherwise exit with a non-zero exit code.

    This command can be used to throttle crontab entries to periods
    that are not directly supported by cron.

        34 2 * * * /path/to/n-hours-ago 502.9 /path/to/timestamp && command

    If the period between checks is more than one "day", you might
    want to decrease your <hours> by 1 to account for short "days"
    due "daylight savings". As long as you only attempt to run it at
    most once an hour the adjustment will not affect your schedule.

    If there is a chance that the last successful run might have
    been launched later "than usual" (maybe due to high system
    load), you might want to decrease your <hours> a bit more.
    Subtract 0.1 to account for up to 6m delay. Subtract 0.02 to
    account for up to 1m12s delay. If you want "every other day" you
    might use <hours> of 47.9 or 47.98 instead of 48.

    You will want to combine the two reductions to accomodate the
    situation where the previous successful run was delayed a bit,
    it occured before a "jump forward" event, and the current date
    is after the "jump forward" event.

EOU
}

if (@ARGV != 2) { usage; die "incorrect number of arguments" }
my $hours = shift;
my $file = shift;

if (-e $file) {
    exit 1 if ((-M $file) * 24 < $hours);
} else {
    open my $fh, '>', $file or die "unable to create $file";
    close $fh;
}
utime undef, undef, $file or die "unable to update timestamp of $file";
exit 0;
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.