programing

지정된 시간 내 Cron 작업 및 랜덤 시간

golfzon 2023. 4. 19. 23:45
반응형

지정된 시간 내 Cron 작업 및 랜덤 시간

PHP 스크립트를 하루에 20번 완전히 임의의 시간에 실행할 수 있는 기능이 필요합니다.그리고 오전 9시부터 오후 11시까지만 운영했으면 합니다.

Linux에서 cron 작업을 만드는 것에 익숙합니다.

그래, 1년 이상 된 질문이지만 뭔가 유용한 걸 덧붙일 수 있을 것 같아

오전 9시에서 오후 11시 사이에 하루에 20번 랜덤 오프셋으로 크론하는 방법은 무엇입니까?크론 내에서는 좀 까다롭네요 14시간을 20회 실행 시간으로 나누니까요다른 답변은 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비트 숫자는 소수점 5자리 중 첫 번째 2자리까지 잘리고 cronjob을 10~99분 지연하기 위한 간결한1 행이 표시됩니다(다만, 분포는 10 ~32 에 치우쳐 있습니다).

다음과 같은 것이 당신에게도 효과가 있을 수 있지만, 나는 그것이 어떤 이유로든 "덜 랜덤"하다는 것을 알게 되었다(아마 벤포드의 법칙은 의사 난수를 변조함으로써 촉발될 것이다).나도 몰라 수학에서 낙제했어bash 탓이야!)

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

cron(최소한 Linux 'vixie-cron'은 이스케이프되지 않은 '%'를 발견하면 행을 종료하므로 위의 '\%'와 같이 계수를 렌더링해야 합니다.

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

그래서 새벽 1시에서 330시 사이에 다음 명령을 실행합니다.오전

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

그것은 나의 임의의 요구에 대응하고 있다.9000초 == 150분 == 2.5시간

원하는 것을 이해하면 실행 시간을 랜덤화하는 bash 스크립트를 실행하는 cron 작업을 수행하는 등 좀 복잡한 작업을 수행해야 합니다.다음과 같은 경우:

crontab:

0 9 * * * /path/to/bashscript

및 /path/to/subscript:

#!/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초가 있습니다.초수를 랜덤화하는 것도 조금 더 복잡합니다.마지막으로 시작 시간은 랜덤으로 서로 독립적이기 때문에 스크립트의 두 개 이상의 인스턴스가 동시에 시작될 수 있습니다(그러나 가능성은 매우 낮습니다).

에서는 cron을 하고 있습니다.RANDOM_DELAY★★★★★★ 。

RANDOM_DELLAY 변수를 사용하면 변수에서 지정한 상한값으로 임의로 분 단위로 작업 시작을 지연할 수 있습니다.

자세한 것은, 을 참조해 주세요.

은 흔히 볼 수 입니다.anacron jobs jobs jobs jobs jobs jobs jobs jobs jobs a a a a a a jobs jobs jobs jobs jobs jobs jobs jobs 。crontab.

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

나는 결국 그것을 이용하게 되었다.sleep $(( 1$(date +%N) % 60 )) ; dostuffsbash &)(bash & sh와 호환)

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

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

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

첫 번째 생각은 20개의 cron 작업을 무작위로 실행하는 것입니다.at (http.ed.ac.uk/CGI/man-cgi?at) 는를 실행하기 위해 됩니다.http://unixhelp.ed.ac.uk/CGI/man-cgi?at) 는 명령어 실행에 사용됩니다.

crontab 명령어는 bash가 아니라 sh로 실행되기 때문에 al-x의 솔루션은 기능하지 않습니다.기능하는 것은 다음과 같습니다.

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

이 예에서는 execute 명령어를 실행하기 전에 랜덤한 시간을 사용할 수 있습니다.

#!/bin/bash
# start time
date +"%H:%M:%S"

# sleep for 5 seconds
sleep $(shuf -i 1-25 -n 1)
# end time
date +"%H:%M:%S"

at -f [file] [timespec]

또는

echo [command] | at [timespec]

또는

at [timespec] 같은 인터랙티브 이 있습니다.인터랙티브 사양은 다음과 같습니다.script녹음을 하고 있습니다.

명령어

at runs stdin 또는 에 의해 지정된 파일에 제공된 텍스트-f [file]

타임스펙

여기 문법이 있습니다.다음과 같은 경우가 있습니다.

  • 24시간 4자리 " int", "24자리 4자리 int").0100,2359,1620
  • now + 10 minutes
  • 2071-05-31 - 5 hours 12 minutes UTC

타임존을 명시적으로 지정하는 경우 timespec의 일부 버전에서는UTC 인수timezone의 .

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

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

한 번 해봐...

pre-pending을 통해 bash 해석을 테스트할 수 있습니다.echo탈출을 위해|(파이프).

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

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

예약된 작업을 보려면atq작업 내용(환경 변수, 셋업 및 명령/스크립트)과at -c [jobid].

메모

시스템은 cron의 일부이며 인터랙티브프롬프트는 셸의 현재 상태 전체를 캡처하기 때문에 절대 경로를 지정하지 않고 명령을 실행할 수 있습니다.

오래된 스레드인 것은 알지만 자주 사용하는 랜덤 값 관련 항목을 하나 추가하고 싶습니다.$RANDOM 변수를 고정 범위와 제한된 범위로 사용하는 대신 셸에서 임의 범위 랜덤 값을 만드는 경우가 많습니다.

dd if=/dev/urandom bs=4 count=1 2>/dev/null | od -N4 -t u4 -A none

예를 들어, 할 수 있습니다.

FULLRANDOM=$(dd if=/dev/urandom bs=4 count=1 2>/dev/null | od -N4 -t u4 -A none)

이 스레드에서 설명한 몇 가지 제한을 극복합니다.

매일 crontab을 다시 쓰는 스크립트를 작성하는 것은 어떨까요?

  1. 현재 cron 읽기(A)
  2. 랜덤 시간 선택(B)
  3. 이전 cron을 다시 쓰고(A), 새로운 random cron을 추가합니다.
  4. 처음에 이 스크립트를 실행하려면 cron에 추가해야 합니다.

같은 문제를 찾고 있었습니다.최적의 해결책은 서버 측에서 일정을 작성하고(프로그래밍 언어에 의해 매우 간단), 이러한 태스크로 DB 테이블에 run_time과 status(new | processed)의 2개의 컬럼을 채우는 것이었습니다.따라서 cron은 매분 실행되며 수행해야 할 작업을 찾습니다(status = new 및 실행 시간 <= now()).매우 심플하고 한 가지 큰 장점이 있습니다.이 경우 인터페이스를 만들어 어떤 일이 일어나는지 볼 수 있습니다.

여기서 검색하신 분들을 위해:

anacron(Ubuntu 데스크톱 및 노트북)을 사용하는 경우

/etc/anacrontab

추가하다

RANDOM_DELAY=XX 

여기서 XX는 기본 작업을 지연하는 시간(분)입니다.

Anacron은 cron과 비슷하지만 사용하시는 컴퓨터가 24시간365일 가동되는 것을 예상하지 않고 시스템이 다운되었기 때문에 놓쳤던 스크립트를 실행합니다.

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

반응형