격주로 cron을 통해 스크립트 실행


12

나는이 작업을 수행하는 방법에 대해 꽤 많은 연구를 해 왔으며 cron에서 매주 목요일마다 일자리를 운영하는 직접적인 방법이 없다는 것을 알았습니다.

지금, 난 그냥 실행하는 스크립트 만드는쪽으로 기울고 있어요 모든 주, 그리고 그것을 실행하면 "플래그"파일을 터치 것, 그리고 그것을 실행 파일이 파일을 제거하기 위해, 이미있는 (그리고 경우를 수행 격주 액션).

내 질문은 격주로 자동 실행되는 액션 스크립트 스크립트의 목표를 달성하는 더 우아하거나 간단한 방법이 있습니까?

감사!


1
플래그 파일 대신 ISO 주 번호를 사용할 수 있습니다. (예 : strftime의 % V)

@Roger : 스크립트 내에서 조건부로 의미한다고 가정합니다.
추후 공지가있을 때까지 일시 중지되었습니다.

@Dennis : 꼭 필요한 것은 아니지만 (예 : 답변이 스크립트 외부에서 어떻게 확인되는지 확인), 가장 중요한 점은 훨씬 간단하고 파일 시스템에 상태가 필요하지 않다는 것입니다. 그러나 나는 그것이 달을 점검하는 것과 비슷한 결점이 있음을 깨달았습니다. 몇 년은 53 주, 어떤 것은 52 주입니다.

답변:


11
0 0 * * Thu bash -c '(($(date +\%s) / 86400 \% 14))' && your-script

나는 게으 르기 때문에 bash를 사용하여 수학을 수행했습니다. 원하는대로 전환하십시오. 나는 1970 년 1 월 1 일 목요일을 활용한다. 다른 요일에는 오프셋을 적용해야합니다. Cron은 퍼센트 기호를 이스케이프해야합니다.

빠른 확인:

function check {
  when=$(date --date="$1 $(($RANDOM % 24)):$(($RANDOM % 60))" --utc)
  echo -n "$when: "
  (($(date +%s --date="$when") / 86400 % 14)) && echo run || echo skip
}

for start in "2010-12-02" "2011-12-01"; do
  for x in $(seq 0 12); do
    check "$start + $(($x * 7)) days"
  done
  echo
done

참고 나는 목요일에 언제라도 실행될 경우 이것이 효과가 있음을 보여주기 위해 무작위 시간을 선택했으며, 4 년과 5 일 목요일이 모두 포함 된 월을 포함하여 연도 경계를 넘는 날짜를 선택했습니다.

산출:

Thu Dec  2 06:19:00 UTC 2010: run
Thu Dec  9 23:04:00 UTC 2010: skip
Thu Dec 16 05:37:00 UTC 2010: run
Thu Dec 23 12:49:00 UTC 2010: skip
Thu Dec 30 03:59:00 UTC 2010: run
Thu Jan  6 11:29:00 UTC 2011: skip
Thu Jan 13 13:23:00 UTC 2011: run
Thu Jan 20 20:33:00 UTC 2011: skip
Thu Jan 27 16:48:00 UTC 2011: run
Thu Feb  3 17:43:00 UTC 2011: skip
Thu Feb 10 05:49:00 UTC 2011: run
Thu Feb 17 08:46:00 UTC 2011: skip
Thu Feb 24 06:50:00 UTC 2011: run

Thu Dec  1 21:40:00 UTC 2011: run
Thu Dec  8 23:24:00 UTC 2011: skip
Thu Dec 15 22:27:00 UTC 2011: run
Thu Dec 22 02:47:00 UTC 2011: skip
Thu Dec 29 12:44:00 UTC 2011: run
Thu Jan  5 17:59:00 UTC 2012: skip
Thu Jan 12 18:31:00 UTC 2012: run
Thu Jan 19 04:51:00 UTC 2012: skip
Thu Jan 26 08:02:00 UTC 2012: run
Thu Feb  2 17:37:00 UTC 2012: skip
Thu Feb  9 14:08:00 UTC 2012: run
Thu Feb 16 18:50:00 UTC 2012: skip
Thu Feb 23 15:52:00 UTC 2012: run

2
신기원 이후의 시간은 기본적으로 UTC이고 cron은 현지 시간으로 실행됩니다. 시스템 시간대가 UTC가 아닌 경우 혼동 될 수 있습니다. ( "왜 실행되지 않습니까? 이미 금요일 UTC입니다"). 일광 절약 시간제를 사용하면이 문제를 해결하기가 훨씬 어려워집니다 (날짜가 현재 UTC 오프셋을 알려주기 때문에 불가능하지는 않습니다)
derobert

5

한 가지 방법은 atLinux를 실행하는 경우 유틸리티 를 사용하는 것 입니다. 스크립트 끝에 이것을 넣을 수 있습니다.

at X + 2 weeks -f myscript

여기서 X 는 스크립트를 실행할 시간입니다. at처음으로 실행하려는 시간 동안 통화를 초기화 하면 위의 설명이 예약 된 통화를 계속 갱신합니다.


이것이 장기적인 해결책이 될 것이라면 이것을 실행하는 것을 권장하지는 않지만 스크립트에서 실행할 필요가 있는지 여부를 알아내는 함수를 작성할 것입니다.
Paul

3

anacron시스템에서 사용할 수 있다면 훨씬 간단 해집니다. 사용하려면 anacron설치되어 있어야하며 루트 액세스 권한이 있어야합니다. 이전 시스템 (예 : RHEL 5.x)에서는 작동하지 않습니다. 이전 버전의 ancron은 부팅시에만 실행됩니다. 최신 시스템 (예 : RHEL 6.x)에서 작동합니다.

을 사용하면 anacron보다 유연한 방식으로 작업을 예약 할 수 있습니다 (예 : 일주일에 한 번 X 작업 실행). 또한 anacron컴퓨터를 사용할 수있게되면 작업을 실행합니다. 즉, 시스템이 작동 중이거나 작동 중지 된 시점을 고려할 필요가 없습니다.

격주로 스크립트를 실행하려면 / etc / anacrontab에 다음과 유사한 행을 추가해야합니다.

14 5 myScript script.sh

자세한 내용은 매뉴얼 페이지를 참조하십시오.


사용하는 anacron것이 가장 깨끗한 솔루션 IMO입니다 (일부 사람들에게 원치 않는 결과가 없다면).
JanC

0

격주로 정의하는 더 우아한 방법이 있는지 확실하지 않지만 이것이 효과가있을 수 있습니다.

00 06 1-7,15-21 * * test `date +\%a` = Thu && /path/to/script

그러면 매월 첫째, 셋째 목요일 오전 6시에 스크립트가 시작됩니다.


2
그러나 목요일이 3 개월 인 한 달이 있으면 일주일을 건너 뛰게됩니다.
David Z

1
목요일이 3 일밖에없는 달이 있습니까? 5 목요일이 있으면 일주일에 건너 뛸 수 있습니다. 로 업데이트 할 수 1-7,15-21,29-31있지만 마지막 세트와 일치하는 항목이 있으면 연속으로 실행됩니다.
20 분 01 초

1
목요일 3시에, 목요일 3 일이 아니라 스크립트가 실행될 3 목요일을 의미 했습니까? 처음으로 잘못 읽었을 수도 있습니다.
20:02에

0

매주 실행하고 주 번호가 홀수인지 확인하기 위해 스크립트를 확인하십시오. 그렇다면 종료하십시오.

이것은 12 월에서 1 월까지 작동하려면 더 많은 생각이 필요합니다.

스크립트가 "마지막으로 성공한 실행"플래그 파일을 설정했을 수 있습니다. 스크립트가 시작되면 14 일 전에 플래그 파일이 마지막으로 수정되었는지 확인하십시오.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.