저는 우분투를 사용하고 있으며 매일 오전 10시에서 오후 11시 사이에 무작위로 Python 스크립트를 실행해야 합니다. 지금은 고정된 시간에만 실행하고 있으며 몇 가지 예를 보았지만 대부분은 정해진 시간 내에 반복적인 작업을 수행하며 하루에 한 번만 필요합니다.
가장 좋은 접근 방식이 무엇인지에 대한 아이디어가 있습니까?
감사합니다!
답변1
cron
임의 시작 시간에 대한 지원을 알지 못합니다 .
그러나 임의의 시간에 실행되도록 스크립트를 at
예약하는 이점을 누릴 수 있습니다 .python
0 10 * * * echo '"/path/to/my_script.py"' | at "now + $(shuf -i 1-780 -n 1)min"
sleep
이는 재부팅 후에도 지속된다는 점에서 제가 사용한 이전 솔루션에 비해 장점이 있습니다 .
atq
작업이 예약된 시간을 확인할 수 있습니다 .
답변2
cron을 전혀 사용하지 마십시오.시스템 타이머이를 위해 다음과 같은 내장 옵션이 있습니다 RandomizedDelaySec
.
RandomizedDelaySec=
Delay the timer by a randomly selected, evenly distributed amount of time between 0
and the specified time value. Defaults to 0, indicating that no randomized delay shall
be applied. Each timer unit will determine this delay randomly before each iteration,
and the delay will simply be added on top of the next determined elapsing time, unless
modified with FixedRandomDelay=, see below.
따라서 귀하의 경우에는 합계 (= 13시간) OnCalendar=*-*-* 10:00:00
가 포함된 타이머가 있습니다. RandomizedDelaySec=46800
바라보다Ask Ubuntu에 관한 이 기사또는아치 리눅스 위키시스템 타이머 설정에 대한 자세한 내용.
답변3
매일 아침 10:00에 작업을 예약하고 임의의 시간(0초에서 46800초 사이) 동안 작업을 휴면 상태로 둡니다.
여기서 유일한 문제는 sleep "$(( RANDOM % 46800 ))"
쉘의 RANDOM
변수(적어도 의 경우 bash
)가 0에서 32767 사이의 값을 가지기 때문에 이를 수행할 수 없다는 것인데, 이는 너무 작습니다.
대신에 awk
,
awk 'BEGIN { srand(); print int(46800*rand()) }'
이는 다음 일정을 사용할 수 있음을 의미합니다.
0 10 * * * sleep "$( awk 'BEGIN { srand(); print int(46800*rand()) }' )" && mypythonscript
RANDOM
또 다른 방법은 어쨌든 변수를 사용하는 것입니다 .분그것으로부터 몇 초 떨어져 있는 것이 아니라. 관심 있는 시간 범위는 정확히 780분이므로 다음과 같이 사용할 수 있습니다.
SHELL=/bin/bash
0 10 * * * sleep "$(( 60*(RANDOM % 780) ))" && mypythonscript
이는 Python 스크립트를 사용하지 않는 한 1분 동안만 시작된다는 의미입니다.RANDOM
다시60
위의 내용을 무작위 로 (RANDOM % 60)
.