프로젝트 일정 (3 주)으로 수행해야 할 작업이 있습니다.
매주 3 주마 다이 작업 을 수행하도록 cron 을 설정할 수 있지만 3 주마 다이 작업을 수행 할 수있는 방법을 찾을 수 없습니다.
스크립트를 해킹하여 임시 파일 (또는 유사한 파일)을 만들 수 있으므로 세 번째로 실행 된 것으로 해결할 수는 있지만이 솔루션은 냄새가납니다.
깨끗하게 할 수 있습니까?
프로젝트 일정 (3 주)으로 수행해야 할 작업이 있습니다.
매주 3 주마 다이 작업 을 수행하도록 cron 을 설정할 수 있지만 3 주마 다이 작업을 수행 할 수있는 방법을 찾을 수 없습니다.
스크립트를 해킹하여 임시 파일 (또는 유사한 파일)을 만들 수 있으므로 세 번째로 실행 된 것으로 해결할 수는 있지만이 솔루션은 냄새가납니다.
깨끗하게 할 수 있습니까?
답변:
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이됩니다.
실행간에 타임 스탬프 파일을 저장할 수있는 경우 현재 날짜에만 의존하지 않고 해당 파일의 날짜를 확인할 수 있습니다.
귀하의 경우 찾기 명령에 대한 분수 값을 지원 -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;