답변:
다음의 조합을 사용하십시오. cron
과 at
. crontabbed 스크립트에는 다음과 유사한 내용이 포함됩니다.
TIME=$(($RANDOM/32768.*60*24*7))m
at -f /usr/local/bin/scriptfile $TIME
에서 /usr/local/bin/scriptfile
실행하고 싶은 명령이 있습니다.
그 문제에 대한 빠른 (그리고 더러운, 나쁜, 아래 주석 참조) 해결책은 매일 cron으로 실행되고 다음과 같이 설계된 bash 스크립트를 작성합니다.
이 셸 스크립트는 매일 명령을 실행하는 데 1/7의 기회가 주어지며 성공적으로 실행될 때마다 파일의 타임 스탬프를 업데이트합니다 ( 'touch'를 사용).
사전에 스크립트를 실행할지 결정하기 위해 파일이 & gt; 7 일인지 확인해야합니다 ( '찾기'가 여기에서 작업을 수행 할 수 있음).
더 좋은 방법이있을 것입니다. 그러나 나는 그것을보기에는 너무 피곤합니다. ^^
최신 정보 : Joe가 지적했듯이이 스크립트에는 몇 주 동안 실행되지 않을 수있는 (그리고 결국에는) 실행되지 않을 것이라는 점에서 큰 결함이 있습니다. 따라서 당신은 그것을 사용해서는 안되지만 그것을 반대 예제로 남겨 둘 것입니다.
lacqui는 정확하지만 그의 설명은 약간 짧습니다.
cron :
0 15 * * 1 /home/myhome/cron/schedulerandomjob.bash
/home/myhome/cron/schedulerandomjob.bash :
#!/bin/bash
TIME="now + $(( RANDOM % (60*24*7) )) minutes "
at -f /path/to/your/script $TIME
cron은 일주일에 한 번 실행되며 일주일에 임의로 발생하는 'at'작업을 예약합니다. (nb, 여기에서 볼 수있는 사건이 있습니다 ... 주말과주의 시작 부분에서 일이 가능하기 때문에 두 번에 걸쳐 동시에 실행될 수도 있습니다. 중요하다면 빼기 모듈러스에서 몇 분이면 확실합니다.
나는 작은 스크립트를 작성했다. weekrand
(조언을 위해 어딘가에서 온라인으로 보았고, 그것이 어디 있는지 잊어 버렸습니다).
#!/bin/bash
FLOOR=1
RANGE=10080 # number of minutes per week
number=0 #initialize
while [ "$number" -le $FLOOR ]
do
number=$RANDOM
let "number %= $RANGE" # Scales $number down within $RANGE.
done
sleep ${number}m
$@
그래서 기본적으로 weekrand {some command} {parameters}
무작위로 {some command}
와 {parameters}
0에서 10080 분 사이, 즉 1 주일 이내.
예제 crontab
그것을 사용하는 행 :
0 0 1 * * nice -n 10 /usr/local/bin/weekrand /root/jobs/weekly_job