मुझे पूरी तरह से यादृच्छिक समय में एक दिन में 20 बार PHP स्क्रिप्ट चलाने की क्षमता की आवश्यकता है। मैं यह भी चाहता हूं कि यह केवल सुबह 9 बजे - 11 बजे के बीच चले।
मैं linux में क्रॉन जॉब्स बनाने से परिचित हूँ।
मुझे पूरी तरह से यादृच्छिक समय में एक दिन में 20 बार PHP स्क्रिप्ट चलाने की क्षमता की आवश्यकता है। मैं यह भी चाहता हूं कि यह केवल सुबह 9 बजे - 11 बजे के बीच चले।
मैं linux में क्रॉन जॉब्स बनाने से परिचित हूँ।
जवाबों:
अगर मुझे समझ में आ जाए कि आप क्या देख रहे हैं, तो आपको कुछ गड़बड़ करने की ज़रूरत होगी, जैसे कि एक क्रॉन जॉब जो एक बैश स्क्रिप्ट को चलाता है जो रन टाइम को यादृच्छिक बनाता है ... कुछ इस तरह:
crontab:
0 9 * * * /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 स्क्रिप्ट लॉन्च करता है। बाहर निकलता है। इसके अलावा, चूंकि यह मिनटों की यादृच्छिक संख्या (सेकंड नहीं) का उपयोग करता है, इसलिए शुरुआत का समय उतना यादृच्छिक नहीं है जितना वे हो सकते हैं। लेकिन $ रैंडम केवल 32,767 तक जाता है, और 9 बजे से 11 बजे के बीच 50,400 सेकंड होते हैं, यह सेकंड्स को यादृच्छिक बनाने के लिए थोड़ा अधिक जटिल होगा। अंत में, चूंकि प्रारंभ का समय एक-दूसरे से यादृच्छिक और स्वतंत्र है, इसलिए यह संभव है (लेकिन बहुत संभावना नहीं है) कि स्क्रिप्ट के दो या अधिक उदाहरण एक साथ शुरू हो जाएंगे।
((maxdelay = 14 * 60))
या ((delay = $RANDOM % maxdelay))
)। sleep
तर्क अभी भी जिस तरह से तुम्हारे पास है (यद्यपि आप, रिक्त स्थान जोड़ सकता है आवश्यक होने पर) की जरूरत है।
sleep $[ ( $RANDOM % 60 ) + 1 ]s && some_script.sh
हाँ, हाँ, प्रश्न एक वर्ष से अधिक पुराना है, लेकिन शायद मैं कुछ उपयोगी जोड़ सकता हूं:
9:11 बजे के बीच दिन में 20 बार एक यादृच्छिक ऑफसेट पर कुछ क्रोन कैसे करें? यह क्रोन के भीतर थोड़े मुश्किल है, क्योंकि आप 20 निष्पादन समय से 14 घंटे विभाजित कर रहे हैं। मुझे दूसरे उत्तर बहुत पसंद नहीं हैं क्योंकि उन्हें आपकी php स्क्रिप्ट के लिए एक bash आवरण स्क्रिप्ट लिखने की आवश्यकता होती है।
हालांकि, अगर आप मुझे 8:30 बजे और 11:09 बजे के बीच 13 बार टाइमिंग और फ्रीक्वेंसी प्रतिबंध को कम करने की स्वतंत्रता देंगे, तो यह चाल हो सकती है, और सभी आपके कॉन्ट्राब के दायरे में:
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 स्क्रिप्ट निष्पादित कर सकें। या अपने प्रतिबंध को 3 बजे से 11 बजे के बीच चलाने के लिए आराम दें।
$[(RANDOM/368)+10]
?
$((RANDOM % 90 + 10))
टेस्ट:for i in {0..9999}; do echo $((RANDOM % 90 + 10)); done | sort | uniq -c
$RANDOM
: sleep $(( $(od -N1 -tuC -An /dev/urandom) \% 90 ))m
।
crontab
करने bash
से पहले उपयोग कर रहे हैं $RANDOM
। यदि आपके पास vixie-cron
(उबंटू पर मेरा मामला लगता है), तो आप SHELL=/bin/bash
शीर्ष पर जोड़ सकते हैं । अन्य क्रोन संस्करणों के लिए यहां और विकल्प हैं: superuser.com/a/264541/260350
crontab: errors in crontab file, can't install. Do you want to retry the same edit?
सहायता मिलती है
इसलिए मैं 1AM और 330AM के बीच कमांड चलाने के लिए निम्नलिखित का उपयोग कर रहा हूं
0 1 * * * perl -le 'sleep rand 9000' && *command goes here*
यह मेरे लिए मेरी यादृच्छिक जरूरतों का ख्याल रखता है। यह 9000 सेकंड == 150 मिनट == 2.5 घंटे है
क्रोन एक RANDOM_DELAY
चर प्रदान करता है । crontab(5)
विवरण के लिए देखें।
RANDOM_DELAY वेरिएबल वेरिएबल द्वारा निर्दिष्ट ऊपरी सीमा के साथ यादृच्छिक रूप से मिनटों में जॉब स्टार्टअप्स को विलंबित करने की अनुमति देता है।
यह आमतौर पर anacron
नौकरियों में देखा जाता है , लेकिन एक में भी उपयोगी हो सकता है crontab
।
आपको इससे सावधान रहने की आवश्यकता है यदि आपके पास कुछ नौकरियां हैं जो ठीक (मिनट) ग्रैन्युलैरिटी और अन्य हैं जो मोटे हैं।
RANDOM_DELAY
एक बार स्थापित किया गया है और डेमन के पूरे क्रम के लिए स्थिर रहता है।
RANDOM_DELAY
ध्वज की विशेषता है cronie-crond जबकि Ubuntu चल रहा प्रतीत हो रहा है vixie-cron
जो इस ध्वज का अभाव है।
मेरा पहला विचार एक क्रॉन जॉब बनाने का होगा, जो 20 बेतरतीब ढंग से नौकरियों पर निर्धारित होगा। at
उपयोगिता (http://unixhelp.ed.ac.uk/CGI/man-cgi?at) निर्दिष्ट समय पर आदेशों को क्रियान्वित करने के लिए प्रयोग किया जाता है।
मैंने उपयोग करना समाप्त कर दिया sleep $(( 1$(date +%N) % 60 )) ; dostuffs
(बैश और श के साथ संगत)
1 उपसर्ग को NON बेस 8 व्याख्या की तारीख +% N (जैसे 00551454) के लिए बाध्य करना है
एक crontab फ़ाइल में \% का उपयोग करके% से बचने के लिए मत भूलना
* * * * * nobody sleep $(( 1$(date +\%N) \% 60 )) ; dostuffs
date
(जो कि आप संभवतः अधिकांश लिनक्स पर करते हैं, लेकिन बिजीबॉक्स, मानक मैकओएस या अन्य बीएसडी-व्युत्पन्न प्लेटफार्मों पर नहीं)।
अल-क्स सॉल्यूशन मेरे लिए काम नहीं करता है क्योंकि क्रॉस्टैब कमांड्स बैश में निष्पादित नहीं होते हैं, लेकिन श में मुझे लगता है। क्या काम करता है:
30 8 * * * bash -c "sleep $[RANDOM\%90]m" ; /path/to/script.py
$[ ... ]
वाया बैक के बाद से घटाया हुआ सिंटैक्स है; इस सहस्राब्दी से कुछ के लिए, आप पसंद करेंगे $((RANDOM\%90))m
जो POSIX- संगत सिंटैक्स है (लेकिन निश्चित रूप RANDOM
से अभी भी केवल बैश है)।
at -f [file] [timespec]
या
echo [command] | at [timespec]
या
at [timespec]
... और इंटरैक्टिव विनिर्देशन की script
रिकॉर्डिंग की तरह ।
रन पर स्टड पर या द्वारा निर्दिष्ट फ़ाइल में पाठ प्रदान करता है -f [file]
।
यहाँ [timespec]
व्याकरण है । यह कुछ इस तरह हो सकता है:
0100
, 2359
,1620
now + 10 minutes
2071-05-31 - 5 hours 12 minutes UTC
यदि आप स्पष्ट रूप से टाइमज़ोन निर्दिष्ट कर रहे हैं, तो टाइमस्पेस के कुछ संस्करण केवल UTC
वैकल्पिक टाइमज़ोन तर्क के लिए अनुमति दे सकते हैं ।
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
अनुसूचित नौकरियों, उपयोग atq
और नौकरी की सामग्री (पर्यावरण संस्करण, सेटअप और कमांड / स्क्रिप्ट) देखने के लिए at -c [jobid]
।
सिस्टम क्रोन का हिस्सा है, और इंटरैक्टिव प्रॉम्प्ट वास्तव में आपके शेल की पूरी वर्तमान स्थिति को कैप्चर करता है, इसलिए आप निरपेक्ष पथ निर्दिष्ट किए बिना कमांड चला सकते हैं।
उन लोगों के लिए जिन्होंने यहां रास्ता देखा:
यदि आप एनाक्रोन (उबंटू डेस्कटॉप और लैपटॉप) का उपयोग कर रहे हैं तो आप संपादित कर सकते हैं
/etc/anacrontab
और जोड़
RANDOM_DELAY=XX
जहां XX उन मिनटों की मात्रा है जो आप आधार नौकरी में देरी करना चाहते हैं।
एनाक्रॉन क्रोन की तरह है लेकिन यह आपके कंप्यूटर को 24x7 (हमारे लैपटॉप की तरह) पर होने की उम्मीद नहीं करता है और उन स्क्रिप्ट को चलाएगा जो कि चूक गए क्योंकि सिस्टम डाउन था।
आप इस उदाहरण के साथ कमांड निष्पादित करने से पहले यादृच्छिक समय का उपयोग करने की कोशिश कर सकते हैं:
#!/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"
एक स्क्रिप्ट बनाने के बारे में क्या है जो हर दिन क्रेस्टब को फिर से लिखता है?
मुझे लगता है कि यह एक पुराना धागा है, लेकिन मैं एक यादृच्छिक-मूल्य से संबंधित चीज जोड़ना चाहता हूं जिसका मैं बहुत उपयोग करता हूं। एक निश्चित और सीमित सीमा के साथ $ 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)
और इस थ्रेड में चर्चा की गई कुछ प्रतिबंधों को दूर करें।
~$info dd
और मैं समझ सकता हूं कि बाईं ओर क्या चल रहा है |
, लेकिन दाईं ओर नहीं बना सकता। इसलिए, overcoming some restrictions
यादृच्छिक मूल्य निर्माण में रुचि रखने वाले मेरे और अन्य लोगों के लिए, आरएचएस की व्याख्या करने में एक पल क्यों नहीं लगता और अपने दृष्टिकोण का उपयोग करने के लिए एक मजबूत पिच बनाएं। स्पष्टीकरण की गहराई दोनों लोगों को आपके द्वारा सुझाई गई प्रक्रिया और इसके लाभों के साथ सहज बनाती है धन्यवाद।