2주마다 실행되도록 크론 작업을 예약하는 방법이 있습니까?
(내가 생각할 수 있는 한 가지 방법은 crontab
두 개의 "날짜" 항목을 추가하는 것입니다...)
답변1
아니요, cron은 요일, 1월의 날짜, 월만 알고 있습니다.
한 달에 두 번 고정된 날짜(예: 1일과 16일)에 명령을 실행하는 것은 쉽습니다.
42 4 1,16 * * do_stuff
격주로 명령을 실행하는 것은 또 다른 이야기입니다. 당신이 할 수 있는 최선의 방법은 매주 명령을 실행하고 격주로 아무 일도 하지 않게 하는 것입니다. Linux에서는 에포크( ) 이후의 초 수를 date +%s
주당 초 수로 나누어 주간 롤오버 패리티 수치를 얻을 수 있습니다. crontab에서는 %
이스케이프가 필요합니다(cron은 %
명령을 실행하기 전에 줄바꿈이 됩니다).
42 4 * * 1 case $(($(date +\%s) / (60*60*24*7))) in *[02468]) do_stuff;; esac
답변2
cron
2주마다(2주마다) 작업을 직접 실행할 수는 없습니다 . 그러나 작업의 주요 부분이 격주로 실행되도록 하는 것은 매우 간단합니다. @Gilles는 하나의 솔루션을 제공했습니다. 여기에 또 다른 솔루션이 있습니다.
42 4 * * 1 test 1 -eq $(($(date +\%g) & 1)) && do_stuff...
이 date +%g
명령은 현재 주 수(연도의 주 수)를 반환하고 비트 AND 연산은 1 또는 0을 반환합니다. 그런 다음 실제 작업을 실행할 수 있는지 여부를 결정하는 데 사용됩니다.
백분율 기호에 대한 동일한 경고 %
: 특별하게 취급되지 crontab
않도록 항목 내에서 이스케이프해야 합니다 .cron
답변3
파티에 늦었다는 건 알지만, 모두들 문제에 대한 한두 가지 해결책을 원합니다...
일요일을 제외하고 OP와 동일한 작업을 수행하고 싶어서 이 게시물을 발견했습니다.
@user140906은 이 코드 조각을 실행할 때 관찰할 수 있는 유효한 우려 사항을 가지고 있습니다.
for n in $(seq 17 33); do ncal -A1 -bw dec 20${n}; done
처음에는 6년마다 반복되는 것 같았습니다. 모두 확인하지는 않았습니다! :-)
그러다가 이걸 발견했어요협회이는 작동해야 하는 @gilles-so-stop-being-evil과 유사한 두 가지 솔루션을 제공하며, 가장 확실한 솔루션은 다음과 같습니다.
#!/bin/bash
# a file marking the state on disk
mark_file=$HOME/.job-run-marker-1
# check whether the job run last time it is invoked
if [ -e $mark_file ] ; then
rm -f $mark_file
else
touch $mark_file
exit 0
fi
# job command is here
예를 들어 crontab 항목을 추가하십시오.
0 2 * * 2 my_script
여러 항목과 함께 사용하도록 쉽게 조정할 수 있습니다 ( 하드코딩 대신 crontab
값 전달 ). 또는 일부 마법을 사용하여 동일한 논리 mark_file
를 // 확장하여 파일의 ID 및 상태/각각을 나타내는 /제거/추가 줄을 추가합니다 . 작업이 실행되었습니다.ID
grep
awk
sed
어쨌든, 이것이 누군가에게, 어쩌면 미래에 나에게도 도움이 되기를 바랍니다!