45일마다 cronjob이 실행되도록 예약하는 방법은 무엇입니까?

45일마다 cronjob이 실행되도록 예약하는 방법은 무엇입니까?

cronjob을 통해 45일마다 쉘 스크립트를 실행하는 방법은 무엇입니까?

답변1

정확히 45일은 필요하지 않지만 "한 달 반"이면 충분하다면 간단한 접근 방식은 3개월마다 시작하고 매월 다음 달 중순에 한 번 실행하는 것입니다. . 그것들:

0 12  1 1,4,7,10  * /path/to/script
0 12 16 2,5,8,11  * /path/to/script

다른 답변은 일반적으로 임의의 간격에 대해 분명히 더 좋지만 어쨌든 45일은 한 달 길이를 기준으로 하는 것처럼 들립니다. 인간 사용자는 매번 하루나 이틀씩 정확한 날짜 표류를 확인하는 것보다 월초나 중순에 일어나는 일에 더 익숙해질 수도 있습니다.

답변2

cron은 이 요구 사항에 대한 간단하고 간단한 변환을 지원하지 않으므로 타임스탬프 파일과 일일 cron 작업을 사용하여 이를 처리하겠습니다.

0 0 * * * /path/to/wrapper/script/below.sh

래퍼 스크립트:

#!/bin/bash
timestampfile=/var/run/this-job/timetampfile

# exit now if it hasn't been 45 days
(( 
  $(date +%s) - $(stat -c %Z "$timestampfile") 
            < 
  (45 * 24 * 60 * 60) 
)) && exit 0

touch "$timestampfile"
: run real script here

이로 인해 여러 가지 위험이 발생합니다.

  • 누군가 타임스탬프 파일을 삭제했습니다.
  • 누군가가 타임스탬프 파일을 터치했습니다(좋든 나쁘든)
  • 실제 스크립트가 45일마다 실행된다는 것이 cron 작업 항목에서 명확하지 않습니다.

답변3

기반으로스택 오버플로에 대한 이 답변, 다음 구문을 사용하여 이 작업을 수행할 수 있습니다.

00 12 * * *  test $(( $(date +\%s)/24/60/60\%45 )) = 20 && your_script

이 작업은 매일 정오에 실행됩니다. 그런 다음 신기원 이후의 일수에 대한 모듈러스를 계산하고 지정한 모듈러스와 같은지 여부를 테스트합니다. 이 예에서는 20을 지정했는데, 이는 오늘(2018-05-09 00:00 GMT에서 23:59 GMT 사이), 오늘부터 45일 등으로 true로 평가됩니다. 다음을 사용하여 다음을 계산/테스트할 수 있습니다.

$ echo $(( $(date +%s)/24/60/60%45 ))
20
$ echo $(( $(date -d '+45 days' +%s)/24/60/60%45 ))
20
$ echo $(( $(date -d '+44 days' +%s)/24/60/60%45 ))
19

(UTC 시간대를 벗어나는 경우에는 시간을 고려해야 할 수도 있습니다.)

답변4

crl사용하기 위해 게시하려고 할 때 비슷한 문제가 발생했습니다 OpenBSD 6.6. 다음 스크립트를 사용하여 다음 시작 시 가장 먼저 예약하십시오.

#!/bin/sh

# copy current crontab to file without launching script    
/usr/bin/crontab -l | grep -v "/var/publishCRL.sh" > /var/tmpCron

# add entry for 45 days from now
# 45 days = 3888000 seconds
/bin/echo $(date -j -r `expr $(date +%s) + 3888000` "+%M %H %d %m")" * /var/publishCRL.sh" >> /var/tmpCron

# load edited crontab
/usr/bin/crontab /var/tmpCron

# cleanup
/bin/rm /var/tmpCron

# do CRL stuff

관련 정보