크론 작업, 무작위로 시작되었지만 시간 범위 내에 있음

크론 작업, 무작위로 시작되었지만 시간 범위 내에 있음

스크립트를 하루에 한 번, 0900에서 1200 사이에 시작하여 실행하고 싶습니다.
대시 구문에 대해 잘 모르겠습니다. 이는 스크립트가 매 시간마다 실행된다는 의미입니까 9-12, 아니면 무작위로 시작됩니까 9-12? 왜냐하면 나에게는 후자가 필요하기 때문이다.

답변1

나는 무작위로 작업을 실행하는 방법이 있는 cron 구현을 본 적이 없습니다. 이것은 이상한 요청입니다. 문서에 나와 있듯이 는 9시에서 12시 사이의 매 시간을 나타내는 9-12약어입니다 .9,10,11,12

임의의 시간에 작업을 실행하려면 간격이 시작될 때 작업을 실행하고 임의 지연을 추가하십시오. 예를 들어, 9시에서 12시 사이의 임의의 시간에 실행하려면 다음을 수행하십시오.

SHELL=/bin/bash
0 9 * * * sleep $((3600 * (RANDOM \% 4))); do_stuff

bash 또는 ksh 가 RANDOM필요하며 기본 셸에서는 사용하지 못할 수도 있습니다.

9시에서 12시 사이의 임의 시간에 실행하고 두 번째 해상도를 갖고 싶다면 RANDOM % 10800이를 지연으로 사용할 수 있지만 RANDOM범위는 0..32767이므로 지연은 0에서 32768 사이로 편향됩니다. % 10800 = 368. 이러한 편향을 방지하려면 다음을 수행하십시오.

SHELL=/bin/bash
0 9 * * * max=$((32768/10800*10800)); while delay=$RANDOM; ((delay > max)); do :; done; sleep $((delay \% 10800)); do_stuff

답변2

나는 Python 스크립트에 대해 비슷한 요구 사항을 갖게 되었지만 결국 스크립트 자체를 통해 무작위+수면 기능을 사용하고 자정에 크론 작업을 시작하여 이를 달성했습니다.

from time import sleep
import random

sleep_time = random.randint(0,7200)  #7200 seconds = 2 hours * 60 min * 60 sec
print(sleep_time)
sleep(sleep_time)

답변3

OpenBSD에서는 버전 6.7(2020년 4월 15일경 스냅샷)부터 ~crontab 파일에 임의 간격을 지정할 수 있습니다.

~ 필드의 문자를 사용하여 임의의 값(적법한 범위 내)을 얻으십시오. 무작위 값의 간격은 명시적으로 지정할 수 있습니다. 예를 들어 0~300에서 30(포함) 사이의 무작위 값이 생성됩니다. 양쪽의 숫자 중 하나(또는 둘 다)가 생략된 경우 ~해당 필드에 대한 적절한 제한(낮음 또는 높음)이 사용됩니다.

30~45 * * * * somecommand

somecommand따라서 매 시간 30분부터 다음 시간 15분 사이의 15분 간격 중 어느 시점에 실행됩니다.

~피카 사용으로 인해하나의, 그러나 범위 내에서 임의의 값이 주어지면 crontab 항목(예:

~ 9~11 * * * somecommand

질문에 나온 명령은 매일 오전 9시부터 정오(오전 11시 59분) 사이에 실행됩니다.

당신은 또한 볼 수 있습니다

경고(설명서에는 언급되지 않음): 임의의 시간은 무작위로 선택되지만안정적인crontab이 다시 로드될 때까지, 즉 cron 데몬이 다시 시작되거나 edit crontab이 사용될 때까지입니다 crontab -e. 따라서 sleepwith 를 사용하는 것처럼 작업을 실행할 때마다 새로운 임의 값을 제공하지 않습니다 $RANDOM.

답변4

이러한 답변의 대부분은 이식 불가능한 기능이나 bashism에 의존합니다. 대시를 요청했으므로 다음은 이식 가능한 솔루션입니다.

0 9 * * * sleep $(echo | awk '{srand(); print rand()*3600*3}') && whatever_you_wanted_to_do

이는 POSIX에 존재하는 것으로 보장된 유틸리티와 구문만 사용하며 최소한의 최소 설치라도 모든 UNIX에서 작동합니다.

관련 정보