3주마다 수요일(오전 8시)에만 크론 작업이 실행되도록 예약할 수 있나요? 또는 이것이 가능하지 않은 경우 27일 이하의 간격으로 작업을 실행하되 수요일 오전 8시에 실행하십시오.
답변1
매주 수요일에 다음 코드를 실행합니다.
tspath="/path/to/timestamp" && [ -f ${tspath} ] && \
[ `date +%s` -lt $(($(cat ${tspath})+20*86400)) ] || \
{ date +%s > ${tspath}; your_command; }
여기서 /path/to/timestamp
는 일반적으로 사용자의 홈 디렉터리 어딘가에 있는 임의의 경로 이름(처음에는 존재하지 않음)입니다(심볼릭 링크 공격을 방지하려면 다른 사용자가 쓸 수 있는 디렉터리를 사용하지 마십시오). 코드는 다음과 같이 작동합니다.
- 이 경로 이름이 아직 존재하지 않으면 현재 날짜를 내용으로 사용하여 경로 이름을 만든 다음 명령을 실행합니다. 날짜는 에포크(Epoch)라는 일부 기원 이후 초 단위로 표시됩니다.
- 이 경로 이름이 존재하는 경우(이 경우 이 스크립트에 의해 생성된 것으로 가정) 명령이 마지막으로 실행된 날짜를 지정합니다. 이 날짜에 20일(20*86400초)을 더하고 결과를 현재 날짜와 비교합니다. 최소 20일이 경과한 경우 경로 이름 내용을 현재 날짜로 업데이트하고 명령을 실행합니다.
이 코드는 매주 수요일(오전 8시) cron을 통해 실행되므로 명령은 3주마다 실행됩니다(1~2주 후, 아직 20일이 지나지 않음).
이 해결 방법은 세 번째 수요일 이전에 컴퓨터가 종료되더라도 계속 작동합니다. 어떤 이유로든 머신이 세 번째 수요일에 종료되면 머신이 켜진 다음 수요일에 명령이 실행됩니다(질문에서는 명령이 수요일 오전 8시에만 실행되어야 함).
편집하다:위 코드를 자체 파일에 넣거나(스크립트로 실행) crontab 파일의 한 줄에 직접 넣을 수 있습니다(이 경우 백슬래시 제거).
답변2
GNU/Linux 및 dillon을 사용하는 경우 crond
( dcron
배포판에 적합한 패키지 찾기)에 설명된 대로 crontab의 보다 세분화된 구문을 사용할 수 있습니다.man 1 crontab
0 8 * * wed ID=job1 FREQ=20d your_job
your_job
이 명령은 마지막 시행일로부터 최소 20일이 경과한 경우 수요일 오전 8시에 시행됩니다.
답변3
이미 크론이 있지만 dcron
변경하고 싶지 않은 경우 다음 크론 작업을 사용할 수 있습니다.
0 8 * * wed n=0 && [[ -e /home/user/.cronjob && -r /home/user/cronjob ]] && read n < /home/user/.cronjob ; [[ $n == 0 ]] && your_actual_job ; echo $(( (n+1) \% 3 )) > /home/user/.cronjob
이것은 일종의 장부를 수행할 것입니다. 매주 수요일에는 크론 작업이 실행됩니다. .cronjob
0, 1 또는 2일 수 있는 에 기록된 값을 가져옵니다 . 0이면 실제 작업이 실행됩니다. 그런 다음 값은 모듈로 3으로 증가되고 다시 기록됩니다 .cronjob
.
"%" 앞에 "\"를 주의하세요. 이는 cron이 "%"를 특별한 방식으로 해석하기 때문에 필요합니다.