IT story

주어진 시간 내 크론 작업 및 임의 시간

hot-time 2020. 9. 17. 18:55
반응형

주어진 시간 내 크론 작업 및 임의 시간


완전히 임의의 시간에 하루에 20 번 PHP 스크립트를 실행할 수있는 기능이 필요합니다. 또한 오전 9 시부 터 오후 11시 사이에만 실행되기를 원합니다.

나는 리눅스에서 크론 작업을 만드는 데 익숙합니다.


당신이 찾고있는 것을 이해한다면, 당신은 실행 시간을 무작위 화하는 bash 스크립트를 실행하는 cron 작업을하는 것과 같이 약간 지저분한 일을해야 할 것입니다.

crontab :

0 9 * * * /path/to/bashscript

그리고 / path / to / bashscript에서 :

#!/bin/bash

maxdelay=$((14*60))  # 14 hours from 9am to 11pm, converted to minutes
for ((i=1; i<=20; i++)); do
    delay=$(($RANDOM%maxdelay)) # pick an independent random delay for each of the 20 runs
    (sleep $((delay*60)); /path/to/phpscript.php) & # background a subshell to wait, then run the php script
done

몇 가지 참고 사항 :이 접근 방식은 오전 9시에 20 개의 백그라운드 프로세스를 실행하고 각각 임의의 시간 (최대 14 시간, 즉 오후 11시) 동안 대기 한 다음 PHP 스크립트를 실행하므로 리소스가 약간 낭비됩니다. 출구. 또한 임의의 분 (초가 아님)을 사용하기 때문에 시작 시간이 가능한만큼 임의적이지 않습니다. 그러나 $ RANDOM은 32,767까지만 올라가고 오전 9시와 오후 11시 사이에는 50,400 초가 있습니다. 초를 랜덤 화하는 것도 조금 더 복잡합니다. 마지막으로, 시작 시간은 임의적이고 서로 독립적이기 때문에 스크립트의 두 개 이상의 인스턴스가 동시에 시작될 가능성이 있습니다.


예, 예, 질문은 1 년이 넘었지만 유용한 정보를 추가 할 수 있습니다.

오전 9시에서 오후 11시 사이에 하루에 20 번 무작위 오프셋으로 무언가를 크론하는 방법은 무엇입니까? 14 시간을 실행 시간 20으로 나누기 때문에 cron 내에서는 다소 까다 롭습니다. 다른 답변은 PHP 스크립트에 대한 bash 래퍼 스크립트를 작성해야하기 때문에별로 좋아하지 않습니다.

그러나 오전 8시 30 분에서 오후 11시 9 분 사이에 타이밍 및 주파수 제한을 13 번으로 완화 할 수있는 자유를 허용한다면, 이것이 트릭을 수행 할 수 있으며 모두 crontab의 범위 내에서 가능합니다.

30 8-21/* * * * sleep ${RANDOM:0:2}m ; /path/to/script.php

$ {RANDOM : 3 : 2}은 다른 사람들이 위에서 언급 한 bash의 $ RANDOM을 사용하지만 bash 배열 슬라이싱을 추가합니다. bash 변수는 유형이 지정되지 않았기 때문에 의사 난수로 서명 된 16 비트 숫자는 10 진수 5 자리 중 처음 2 자리로 잘려 10 ~ 99 분 사이에 cronjob을 지연시키기위한 간결한 한 줄을 제공합니다 (분포는 10 ~ 32).

다음도 효과가있을 수 있지만 어떤 이유로 "덜 무작위"라는 것을 알았습니다 (아마도 Benford의 법칙은 의사 난수를 변조하여 트리거됩니다. 이봐, 모르겠어, 수학을 망 쳤어 ... bash에서!) :

30 8-21/* * * * sleep $[RANDOM\%90]m ; /path/to/script.php

cron (적어도 Linux 'vixie-cron')은 이스케이프 처리되지 않은 '%'를 만나면 줄을 종료하기 때문에 모듈러스를 위의 '\ %'로 렌더링해야합니다.

7 시간 범위의 다른 줄을 추가하여 나머지 7 개의 스크립트 실행을 얻을 수 있습니다. 또는 제한을 완화하여 오전 3시에서 오후 11시 사이에 달리십시오.


그래서 1AM과 330AM 사이에 명령을 실행하기 위해 다음을 사용하고 있습니다.

0 1 * * * perl -le 'sleep rand 9000' && *command goes here*

그것은 나를 위해 내 임의의 요구를 처리하고 있습니다. 9000 초 == 150 분 == 2.5 시간


Cron은 RANDOM_DELAY변수를 제공 합니다. 자세한 내용은 crontab(5)을 참조하십시오.

RANDOM_DELAY 변수를 사용하면 변수에 지정된 상한을 사용하여 임의의 시간 (분)으로 작업 시작을 지연 할 수 있습니다.

이것은 일반적으로 anacron작업 에서 볼 수 있지만 crontab.

미세한 (분) 단위로 실행되는 일부 작업과 거친 작업이있는 경우이 작업에주의해야 할 수 있습니다.


내 첫 번째 생각은 작업에서 무작위로 예약 된 20 개의 cron 작업을 시작하는 것입니다. at유틸리티 (http://unixhelp.ed.ac.uk/CGI/man-cgi?at) 지정된 시간에 명령을 실행하는 데 사용됩니다.


나는 sleep $(( 1$(date +%N) % 60 )) ; dostuffs(bash & sh와 호환 가능)

1 접두사는 날짜 + % N (예 : 00551454)의 NON base 8 해석을 강제합니다.

crontab 파일에서 \ %를 사용하여 %를 이스케이프하는 것을 잊지 마십시오.

* * * * *  nobody  sleep $(( 1$(date +\%N) \% 60 )) ; dostuffs 

at -f [file] [timespec]

또는

echo [command] | at [timespec]

또는

at [timespec]... 그리고 script의 녹음 과 같은 대화 형 사양 .

명령

At runs the text provide on stdin or in the file specified by -f [file].

Timespec

Here's the [timespec] grammar. It can be something like:

  • 24-hour time as 4-digit int, e.g. 0100, 2359, 1620
  • now + 10 minutes
  • 2071-05-31 - 5 hours 12 minutes UTC

If you're explicitly specifying the timezone, some versions of the timespec might only allow UTC for the optional timezone argument.

Example

cat script.sh | at now + $(($RANDOM % 10)) hours $(($RANDOM % 60)) minutes

at -f script.sh now + $(($RANDOM % 10)) hours $(($RANDOM % 60)) minutes

Try it out...

You can test the bash parsing by pre-pending echo and escaping the | (pipe).

echo cat script.sh \| at now + $(($RANDOM % 10)) hours $(($RANDOM % 60)) minutes

echo at -f script.sh now + $(($RANDOM % 10)) hours $(($RANDOM % 60)) minutes

To see jobs scheduled, use atq and job contents (environment vars, setup, and command/script) with at -c [jobid].

Note

The system is part of cron, and the interactive prompt actually captures the whole current state of your shell, so you can run commands without specifying absolute paths.


For those who googled the way here:

If you are using anacron(Ubuntu desktop and laptop) then you can edit

/etc/anacrontab

and add

RANDOM_DELAY=XX 

Where XX is the amount of minutes you want to delay the base job.

Anacron is like cron but it does not expect your computer to be on 24x7 (like our laptops) and will run the scripts that it missed because the system was down.


al-x 's Solution does not work for me since crontab commands are not executed in bash but in sh I guess. What does work is:

30 8 * * * bash -c "sleep $[RANDOM\%90]m" ; /path/to/script.py

참고URL : https://stackoverflow.com/questions/9049460/cron-jobs-and-random-times-within-given-hours

반응형