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


101

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

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


1
질문은 잘 제기되지 않았습니다. 궁극적으로 오전 9시에서 오전 11시 사이에 시간 축에서 20 개의 포인트를 배포하려고합니다. 그러나 최소 시차에 대한 제약이 있습니까? 오전 9시에서 오전 10시 30 분 사이에 아무것도하지 않는 것이 허용됩니까? 이 작업을 수행하는 유일한 방법은 Klaus의 생각에 따라 보입니다. 09:00에 20 번을 선택하여 제약 조건을 충족 한 다음 "at"으로 일정을 잡을 수 있습니다.
David Tonhofer 2013 년

답변:


38

당신이 찾고있는 것을 이해한다면, 당신은 실행 시간을 무작위 화하는 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 초가 있습니다. 초를 랜덤 화하는 것도 조금 더 복잡합니다. 마지막으로, 시작 시간은 무작위이며 서로 독립적이므로 스크립트의 두 개 이상의 인스턴스가 동시에 시작될 가능성은 거의 없습니다.


2
달러 기호를 삭제하고 이중 괄호를 왼쪽으로 이동하여 (예 : ((maxdelay = 14 * 60))또는 ((delay = $RANDOM % maxdelay))) 산술 할당을 더 읽기 쉽게 만들 수 있습니다 . sleep인수는 여전히 (원하는 경우, 공백을 추가 할 수 있지만) 당신이 그것을 가지고있는 방법이 필요합니다.
추후 공지가있을 때까지 일시 중지되었습니다.

1
이것은 나에게도 효과적이었습니다. 내 사용자 정의 bash는 스크립트 외모는 다음과 같은 sleep $[ ( $RANDOM % 60 ) + 1 ]s && some_script.sh
시암 Habarakada

오전 나는 뭔가를 놓치고 또는 최대 지연은 maxdelay = $ ((14 * 20분의 60))로 설정해야합니다
jenish Sakhiya

@jenishSakhiya 20 개의 실행 각각에 대한 무작위 지연은 절대적이며 (음, 오전 9시에 시작) 다른 실행과 관련이 없습니다. 즉, 임의 지연 중 하나가 13 시간으로 나타나면 다른 실행 후 13 시간이 아니라 오후 10시에 실행됩니다 (오전 9시 후 13 시간).
고든 데이비슨

139

예, 예, 질문은 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시 사이에 달리십시오.


4
나는 늦은 대답을 좋아합니다. 하지만 10에서 99 사이의 범위에 균등하게 분포 된 임의의 정수를 생성하려고하고 RANDOM의 출력이 0에서 32,767 인 경우 왜 그렇게하지 $[(RANDOM/368)+10]않겠습니까?
jsdalton 2013 년

3
@jsdalton : 모듈로 연산자가 더 좋을까요? $((RANDOM % 90 + 10))테스트 :for i in {0..9999}; do echo $((RANDOM % 90 + 10)); done | sort | uniq -c
geon

5
그것은 bashism을 피하기 위해 더 나은 될 수 있도록 많은 시스템에서 크론은 기본적으로 떠들썩한 파티를 사용하지 않습니다 $RANDOM: sleep $(( $(od -N1 -tuC -An /dev/urandom) \% 90 ))m.
pabouk

9
crontab사용 bash하기 전에 사용 하고 있는지 확인하십시오 $RANDOM. vixie-cron(우분투에서 내 경우처럼) 있다면 SHELL=/bin/bash상단에 추가 할 수 있습니다 . 다른 크론 버전에 대한 더 많은 대안이 여기에 있습니다 : superuser.com/a/264541/260350
DaAwesomeP

1
위의 첫 번째 제안을 사용할 때 crontab: errors in crontab file, can't install. Do you want to retry the same edit?도움을 받으십시오
Seano 2015-09-13

72

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

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

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


8
:: MindBLOWN :: 약간의 펄을 사용하는 또 다른 모호한 곳입니다.
Mark Carpenter Jr.

이것은 확실히 가장 깨끗한 대답입니다
Enrico Detoma

그러나 이것은 많은 프로세스를 생성하므로 비효율적입니다.
kahveciderin

21

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

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

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

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


RANDOM_DELAY 변수를 사용하고 싶지만 Ubuntu 14.04.4 LTS의 crontab (5) 맨 페이지에서 힌트를 찾을 수 없습니다.
Exocom

운이 없었어. 거기에서 지원되지 않는지 궁금합니다. Centos 7 및 Arch Linux의 맨 페이지에 문서화되어 있습니다.
Micah Elliott

9
이것은 정답처럼 보이지만 예를 들어 줄 수 있습니까?
chovy

14
참고 RANDOM_DELAY이 연결되면 데몬의 전체 런타임 일정하게 유지됩니다.
Maciej Swic

5
RANDOM_DELAY플래그는 cronie-crond의 기능이며 Ubuntu vixie-cron는이 플래그가없는 실행중인 것으로 보입니다 .
kravietz

7

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


at 사용의 예는 다음과 같습니다. stackoverflow.com/a/6136145/803174
Kangur

6

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

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

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

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

2
누군가 나처럼 궁금해한다면 : % N은 현재 나노를 제공하지만 일부 매뉴얼 페이지에는 이에 대한 정보가 없습니다. 이것은 명령마다 쉽게 "일부 무작위성"이 필요한 사람들에게 매우 영리한 솔루션입니다.
Thorsten Schöning

이미 다른 곳에서 다룬주의 사항을 제외하고, 이것은 GNU가있는 경우에만 작동합니다 date(대부분의 Linux에서 수행 할 수 있지만 Busybox, 표준 MacOS 또는 기타 다양한 BSD 파생 플랫폼에서는 수행하지 않음).
tripleee

4

crontab 명령이 bash에서 실행되지 않지만 sh에서 실행되기 때문에 al-x의 솔루션이 작동하지 않습니다. 작동하는 것은 :

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

나는 모든 것을 시도했지만 여전히 작동하지 않았습니다. 이유를 설명했습니다. 감사합니다!
marlar

$[ ... ]waaaay back 이후 더 이상 사용되지 않는 구문입니다. 이 천년기부터는 $((RANDOM\%90))mPOSIX 호환 구문을 선호 할 것 입니다 (물론 RANDOM여전히 Bash 전용입니다).
tripleee

1

at -f [file] [timespec]

또는

echo [command] | at [timespec]

또는

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

명령

실행시 텍스트는 stdin 또는에 의해 지정된 파일 에 제공 됩니다 -f [file].

타임 스펙

여기에 [timespec] 문법이 있습니다. 다음과 같을 수 있습니다.

  • 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

시도해보세요 ...

(파이프) 를 미리 보류 echo하고 이스케이프 하여 bash 구문 분석을 테스트 할 수 있습니다 |.

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의 일부이며 대화 형 프롬프트는 실제로 셸의 전체 현재 상태를 캡처하므로 절대 경로를 지정하지 않고도 명령을 실행할 수 있습니다.


0

여기에서 방법을 검색 한 사람들을 위해 :

anacron (Ubuntu 데스크톱 및 노트북)을 사용하는 경우 편집 할 수 있습니다.

/etc/anacrontab

그리고 추가

RANDOM_DELAY=XX 

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

Anacron은 cron과 비슷하지만 컴퓨터가 연중 무휴로 작동 할 것으로 예상하지 않으며 (노트북처럼) 시스템이 다운되어 놓친 스크립트를 실행합니다.


0

이 예제를 사용하여 명령을 실행하기 전에 임의의 시간을 사용할 수 있습니다.

#!/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"

0

매일 crontab을 다시 작성하는 스크립트를 만드는 것은 어떻습니까?

  1. 현재 크론 읽기 (A)
  2. 무작위 시간 선택 (B)
  3. 이전 크론을 다시 작성하고 (A), 새로운 임의 크론을 추가합니다 (B).
  4. 먼저이 스크립트를 실행하려면 크론에 추가해야합니다.

2
댓글을 답변으로 게시하여 평판 시스템을 우회하지 마십시오. 그러나 귀하의 의견 은 실제로 답변 이 만큼 충분히 좋아 보입니다 . 제거하는 것이 좋습니다. " 코멘트를 추가 할 담당자가 없지만 .
Ted Lyngmo

1
나는 방금이 답변을 검토하고 마지막에 질문하는 부분을 놓쳤습니다 (내 부분에 대한 조잡한 작업). 답변에서 질문하지 마십시오. 질문에 대한 자신의 질문을 게시하십시오. 나는 당신의 반 질문을 답을 얻을 수있는 것으로 만들었습니다.
테드 링모

1
알았다! 고마워. 다음에 더 조심 할게요, 나쁜 의도는 없었어요.
mellofellow

1
나는 당신이 나쁜 의도가 없었고 지나치게 조심할 필요가 없다고 확신합니다. 당신은 가능한 해결책을 설명했고 결국 약간 비틀 거 렸습니다. 걱정 마!
Ted Lyngmo

0

이전 스레드라는 것을 알고 있지만 자주 사용하는 임의 값 관련 항목을 하나 추가하고 싶습니다. 고정 및 제한된 범위의 $ 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)

이 스레드에서 논의 된 몇 가지 제한 사항을 극복합니다.


1
SO에 오신 것을 환영합니다. 글쎄, 오래된 스레드이든 아니든, 이것은 나를 보냈고 ~$info dd의 왼쪽에서 무슨 일이 일어나고 있는지 이해할 |수 있지만 오른쪽을 알아낼 수는 없습니다. 따라서 저와 overcoming some restrictions임의 값 생성에 관심이 있는 다른 사람들 을 위해 잠시 시간을내어 RHS에 대해 설명하고 접근 방식을 사용하는 데 더 강력한 프레젠테이션을하는 것은 어떻습니까? 설명의 깊이는 사용자가 제안한 프로세스와 그 이점에 대해 사람들을 편안하게합니다. 감사합니다.
Chris

그래. od 일명 "8 진 덤프"는 파일 또는 stdin을 가져와 사람이 읽을 수있는 형식으로 이진 데이터를 덤프합니다. 우리는 숫자를 부호없는 십진수 (-t u4)로 표시하고 주소 인덱스 (-A 없음)를 원하지 않습니다. -N4는 우리가 4 바이트만을 취하기 때문에 중복되지만 어느 쪽도 아프지 않습니다. 이것이 설명이되기를 바랍니다 ...
MLP
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.