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