2012-01-28 6 views
61

मुझे दिन में 20 बार एक PHP स्क्रिप्ट को पूरी तरह से यादृच्छिक समय पर चलाने की क्षमता की आवश्यकता है। मैं यह भी चाहता हूं कि यह केवल 9 बजे से 11 बजे के बीच चलें।क्रोन नौकरियां और यादृच्छिक समय, दिए गए घंटों के भीतर

मैं लिनक्स में क्रॉन नौकरियां बनाने से परिचित हूं।

+0

प्रश्न बहुत अच्छी तरह से तैयार नहीं है। आखिरकार आप समय धुरी पर 9 बजे से 11 बजे के बीच 20 अंक वितरित करना चाहते हैं। लेकिन क्या न्यूनतम समय के अंतर पर बाधाएं हैं? 9 बजे से 10:30 बजे के बीच कुछ भी नहीं कर रहा है? ऐसा करने का एकमात्र तरीका स्वीकार्य रूप से क्लाउस के विचार को लगता है: 09:00 पर अपना 20 बार चुनें, जो आपको अपनी बाधाओं को पूरा करने की अनुमति देता है, फिर चीजों को "एट" के साथ शेड्यूल करता है। –

उत्तर

25

तो मैं समझता हूँ कि आप जो खोज रहे हैं, आप कुछ एक सा गन्दा करने के लिए, एक क्रॉन जॉब है कि एक bash स्क्रिप्ट रन बार randomizes ... कुछ इस तरह से चलाता है होने की तरह की आवश्यकता होगी:

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 

कुछ नोट: इस दृष्टिकोण संसाधनों का यह एक छोटे बेकार है, यह 9a पर 20 पृष्ठभूमि प्रक्रियाओं बंद आग के रूप में मीटर, जिनमें से प्रत्येक यादृच्छिक संख्या के लिए इंतजार कर रहा है (14 घंटे तक, यानी 11 बजे तक), फिर PHP स्क्रिप्ट लॉन्च करता है और बाहर निकलता है। इसके अलावा, चूंकि यह यादृच्छिक संख्या (सेकंड नहीं) का उपयोग करता है, इसलिए प्रारंभ समय उतना यादृच्छिक नहीं है जितना वे हो सकते हैं। लेकिन $ RANDOM केवल 32,767 तक चला जाता है, और 9, 11 और 11 बजे के बीच 50,400 सेकेंड होते हैं, यह सेकंड को यादृच्छिक करने के लिए थोड़ा और जटिल होगा। अंत में, चूंकि प्रारंभ समय एक दूसरे से यादृच्छिक और स्वतंत्र हैं, इसलिए यह संभव है (लेकिन बहुत संभावना नहीं है) कि स्क्रिप्ट के दो या दो से अधिक उदाहरण एक साथ शुरू हो जाएंगे।

+1

आप अंकगणित असाइनमेंट को डॉलर के चिह्न को छोड़कर और डबल पैरों को बाईं ओर ले जाकर अधिक पठनीय बना सकते हैं (उदा। '((Maxdelay = 14 * 60))' या '((देरी = $ RANDOM% maxdelay))। 'नींद' तर्क अभी भी आपके पास होने की आवश्यकता है (हालांकि वांछित होने पर आप रिक्त स्थान जोड़ सकते हैं)। –

+0

यह मेरे लिए भी काम किया। मेरी कस्टम बैश स्क्रिप्ट 'नींद $ [($ RANDOM% 60) + 1] s && some_script.sh' –

5

मेरा पहला विचार नौकरियों में यादृच्छिक रूप से निर्धारित 20 क्रॉन जॉब लॉन्च करना होगा। at उपयोगिता (http://unixhelp.ed.ac.uk/CGI/man-cgi?at) निर्दिष्ट समय पर आदेश निष्पादित करने के लिए उपयोग की जाती है।

+0

पर उपयोग करने का एक उदाहरण यहां है: http://stackoverflow.com/a/6136145/803174 – Kangur

88

हाँ, हाँ, सवाल एक वर्ष से अधिक पुराना है, लेकिन शायद मैं कुछ उपयोगी जोड़ सकते हैं: 9 और 11 के बीच ऑफसेट एक यादृच्छिक पर

कैसे कुछ क्रॉन करने के लिए 20 बार एक दिन? यह क्रॉन के भीतर थोड़ी मुश्किल है, क्योंकि आप 20 निष्पादन समय से 14 घंटे विभाजित कर रहे हैं। मुझे अन्य उत्तरों को बहुत पसंद नहीं है क्योंकि उन्हें आपकी PHP स्क्रिप्ट के लिए एक बैश रैपर स्क्रिप्ट लिखना आवश्यक है।

हालांकि, अगर आप मुझे स्वतंत्रता 8:30 बजे से 11:09 बजे के बीच 13 बार करने के लिए समय और आवृत्ति प्रतिबंध को कम करने की अनुमति देंगे, इस चाल कर सकते हैं, और सभी अपने crontab की सीमाओं के अंदर:

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

$ {रैंडम: 3: 2} बैश के $ रैंडम का उपयोग करता है जो अन्य लोगों ने ऊपर वर्णित किया है, लेकिन बैश सरणी स्लाइसिंग जोड़ता है। चूंकि बैश वैरिएबल अवांछित हैं, छद्म-यादृच्छिक हस्ताक्षरित 16-बिट संख्या को इसके 5 दशमलव अंकों के पहले 2 में छोटा कर दिया जाता है, जिससे आप 10 और 99 मिनट के बीच अपने क्रोनबॉब में देरी के लिए एक संक्षिप्त एक-लाइनर देते हैं (हालांकि वितरण पक्षपातपूर्ण है 10 से 32)।

निम्नलिखित आपके लिए भी काम कर सकता है, लेकिन मुझे लगता है कि यह किसी कारण से "कम यादृच्छिक" हो सकता है (शायद बेनफोर्ड का कानून छद्म-यादृच्छिक संख्याओं को संशोधित करके ट्रिगर किया गया है। अरे, मुझे नहीं पता, मैंने गणित को झुकाया। .. बैश पर यह दोष):

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

आप '\%' क्योंकि ऊपर क्रॉन (अच्छी तरह से, कम से कम लिनक्स 'विक्सी-क्रॉन') लाइन समाप्त हो जाता है जब यह कोई अनपेक्षित सामना करना पड़ता है 'के रूप में प्रस्तुत करना मापांक करने की जरूरत है % '।

शायद आप 7 घंटे की सीमा के साथ एक और लाइन जोड़कर शेष 7 स्क्रिप्ट निष्पादन प्राप्त कर सकते हैं। या 3am और 11pm के बीच चलाने के लिए अपने प्रतिबंध को आराम दें।

+4

मुझे देर से उत्तर पसंद है। लेकिन यदि आप 10 से 99 की सीमा में समान रूप से वितरित एक यादृच्छिक पूर्णांक उत्पन्न करने की कोशिश कर रहे हैं, और रैंडम का आउटपुट 0 से 32,767 है, तो आप केवल '$ [(RANDOM/368) +10] क्यों नहीं करेंगे ? – jsdalton

+1

@jsdalton: मॉड्यूल ऑपरेटर बेहतर नहीं होगा? '$ ((रैंडम% 90 + 10)) 'टेस्ट:' मैं {0..9 999} में; echo $ ((रैंडम% 90 + 10)); किया सॉर्ट | uniq -c' – geon

+1

कई प्रणालियों पर क्रॉन डिफ़ॉल्ट रूप से बैश का उपयोग नहीं करता है, इसलिए बैशिज्म '$ RANDOM' से बचने के लिए बेहतर हो सकता है: 'नींद $ (($ (od -N1 -tuC -An/dev/urandom) \% 9 0)) एम'। – pabouk

37

तो मैं 1 और 330AM

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

के बीच एक आदेश है कि मेरे लिए मेरी यादृच्छिक जरूरतों का ख्याल ले रही चलाने के लिए निम्नलिखित का उपयोग कर रहा हूँ। यही कारण है कि 9000 सेकंड == है 150 मिनट == 2.5 घंटे

3

मैं sleep $((1$(date +%N) % 60)) ; dostuffs (संगत बैश & श)

1 उपसर्ग एन (जैसे 00,551,454)

गैर आधार मजबूर करने के लिए तिथि +% की 8 व्याख्या है का उपयोग कर समाप्त हो गया

एक crontab फ़ाइल

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

+2

मदद करें यदि कोई आश्चर्य करता है, तो मेरे जैसे:% N वर्तमान नैनो प्रदान करता है, लेकिन कुछ मैन पृष्ठों में इसके लिए जानकारी की कमी है। यह उन लोगों के लिए एक बहुत ही चालाक समाधान है, जिन्हें प्रति कम आसानी से "कुछ यादृच्छिकता" की आवश्यकता होती है। –

10

क्रॉन एक RANDOM_DELAY चर प्रदान करता है में \% का उपयोग% से बचने के लिए मत भूलना। विवरण के लिए crontab(5) देखें।

RANDOM_DELAY चर ऊपरी सीमा चर द्वारा निर्दिष्ट के साथ मिनट के यादृच्छिक राशि से काम स्टार्टअप में देरी की अनुमति देता है।

यह anacron नौकरियों में आमतौर पर देखा जाता है, लेकिन यह भी एक crontab में उपयोगी हो सकता है।

यदि आपके पास कुछ नौकरियां हैं जो ठीक (मिनट) ग्रैन्युलरिटी और अन्य मोटे हैं, तो आपको इससे सावधान रहना पड़ सकता है।

+0

मुझे RANDOM_DELAY चर का उपयोग करना अच्छा लगेगा, लेकिन उबंटू 14.04.4 एलटीएस पर क्रोंटब (5) के मैनपेज में कोई संकेत नहीं मिल रहा है। – Exocom

+0

यह दुर्भाग्यपूर्ण है। मुझे आश्चर्य है कि यह वहां समर्थित नहीं है। मैं इसे सेंटोस 7 और आर्क लिनक्स पर उस मैनपेज में दस्तावेज करता हूं। –

+2

यह सही उत्तर की तरह लगता है लेकिन क्या आप एक उदाहरण डाल सकते हैं? – chovy

0

at -f [file] [timespec]

या

echo [command] | at [timespec]

या

at [timespec] ... और इंटरैक्टिव विनिर्देश script की रिकॉर्डिंग की तरह।

कमान

पर पाठ stdin पर या -f [file] द्वारा निर्दिष्ट फ़ाइल में प्रदान चलाता है।

Timespec

यहाँ [timespec] grammar है। यह कुछ ऐसा हो सकता है:

  • 24-घंटे के समय के रूप में 24-घंटे का समय, उदा। 0100, 2359, 1620
  • now + 10 minutes
  • 2071-05-31 - 5 hours 12 minutes UTC

आप स्पष्ट रूप से समय-क्षेत्र से timespec केवल वैकल्पिक समय क्षेत्र तर्क के लिए UTC अनुमति दे सकते हैं की some versions निर्दिष्ट कर रहे हैं।

उदाहरण

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

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

इसे आजमाएं ...

आप पूर्व लंबित 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

at -c [jobid] साथ शेड्यूल किए गए कार्यों को देखने के लिए atq और नौकरी सामग्री का उपयोग (पर्यावरण वार्स, सेटअप, और आदेश/लिपि)।

नोट

प्रणाली क्रॉन का हिस्सा है, और इंटरैक्टिव शीघ्र वास्तव में, अपने खोल के पूरे वर्तमान स्थिति को दर्शाता है ताकि आप पूर्ण पथ निर्दिष्ट किए बिना आदेशों चला सकते हैं।

0

जो लोग जिस तरह से यहां googled के लिए:

आप anacron (उबंटू डेस्कटॉप और लैपटॉप) का उपयोग कर रहे हैं तो आप

/etc/anacrontab 

को संपादित करने और

RANDOM_DELAY=XX 

जोड़ने XX कहां है सकते हैं आधार नौकरी में देरी करने के लिए आप कितने मिनट चाहते हैं।

एनाक्रॉन क्रॉन की तरह है लेकिन यह आपके कंप्यूटर को 24x7 (हमारे लैपटॉप की तरह) होने की उम्मीद नहीं करता है और यह उन स्क्रिप्ट को चलाएगा जो सिस्टम को नीचे छोड़ दिया गया था।

संबंधित मुद्दे