क्रोन नौकरियों और यादृच्छिक समय, दिए गए घंटों के भीतर


100

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

मैं linux में क्रॉन जॉब्स बनाने से परिचित हूँ।


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

जवाबों:


38

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

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 सेकंड होते हैं, यह सेकंड्स को यादृच्छिक बनाने के लिए थोड़ा अधिक जटिल होगा। अंत में, चूंकि प्रारंभ का समय एक-दूसरे से यादृच्छिक और स्वतंत्र है, इसलिए यह संभव है (लेकिन बहुत संभावना नहीं है) कि स्क्रिप्ट के दो या अधिक उदाहरण एक साथ शुरू हो जाएंगे।


2
आप डॉलर के चिन्ह को गिराकर और डबल परेंस को बाईं ओर ले जाकर अंकगणित को अधिक पठनीय बना सकते हैं (जैसे ((maxdelay = 14 * 60))या ((delay = $RANDOM % maxdelay)))। sleepतर्क अभी भी जिस तरह से तुम्हारे पास है (यद्यपि आप, रिक्त स्थान जोड़ सकता है आवश्यक होने पर) की जरूरत है।
अगली सूचना तक रोक दिया गया।

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

क्या मुझे कुछ याद आ रहा है या अधिकतम विलंब अधिकतमदले = $ ((१४ * ६० / २०)) पर सेट होना चाहिए
जेनिष सखिया २३'१

@jenishSakhiya 20 रन में से प्रत्येक के लिए यादृच्छिक देरी निरपेक्ष है (अच्छी तरह से, 9 बजे से शुरू), अन्य रनों के सापेक्ष नहीं। यही है, अगर कोई एक यादृच्छिक विलंब 13 घंटे के रूप में आता है, तो इसका मतलब है कि यह 10pm (9 बजे के बाद 13 घंटे) पर चलेगा, अन्य किसी भी रन के 13 घंटे बाद नहीं।
गॉर्डन डेविसन

138

हाँ, हाँ, प्रश्न एक वर्ष से अधिक पुराना है, लेकिन शायद मैं कुछ उपयोगी जोड़ सकता हूं:

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 बजे के बीच चलाने के लिए आराम दें।


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

3
@jsdalton: मोडुलो ऑपरेटर बेहतर नहीं होगा? $((RANDOM % 90 + 10))टेस्ट:for i in {0..9999}; do echo $((RANDOM % 90 + 10)); done | sort | uniq -c
जौन

5
तो यह बेहतर हो सकता है bashism से बचने के लिए कई सिस्टम पर क्रॉन डिफ़ॉल्ट रूप से पार्टी का उपयोग नहीं करता $RANDOM: sleep $(( $(od -N1 -tuC -An /dev/urandom) \% 90 ))m
पाबौक

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?सहायता मिलती है
सीनो सेप

72

इसलिए मैं 1AM और 330AM के बीच कमांड चलाने के लिए निम्नलिखित का उपयोग कर रहा हूं

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

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


8
:: माइंडब्लॉउड :: एक और अस्पष्ट जगह एक छोटे से पर्ल का उपयोग करने के लिए।
मार्क कारपेंटर जूनियर

यह निश्चित रूप से सबसे साफ जवाब है
एनरिको डेटोमा

यह एक प्रकार का अक्षम्य है, क्योंकि आप बहुत सारी प्रक्रियाएँ बना रहे हैं।
kahveciderin

21

क्रोन एक RANDOM_DELAYचर प्रदान करता है । crontab(5)विवरण के लिए देखें।

RANDOM_DELAY वेरिएबल वेरिएबल द्वारा निर्दिष्ट ऊपरी सीमा के साथ यादृच्छिक रूप से मिनटों में जॉब स्टार्टअप्स को विलंबित करने की अनुमति देता है।

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

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


मैं RANDOM_DELAY चर का उपयोग करना पसंद करूंगा, लेकिन Ubuntu 14.04.4 LTS पर crontab (5) के मैनपेज में कोई संकेत नहीं मिल सकता है।
12

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

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

14
कृपया ध्यान दें कि RANDOM_DELAYएक बार स्थापित किया गया है और डेमन के पूरे क्रम के लिए स्थिर रहता है।
मैकीज स्विक

5
RANDOM_DELAYध्वज की विशेषता है cronie-crond जबकि Ubuntu चल रहा प्रतीत हो रहा है vixie-cronजो इस ध्वज का अभाव है।
kravietz

7

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


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

6

मैंने उपयोग करना समाप्त कर दिया sleep $(( 1$(date +%N) % 60 )) ; dostuffs(बैश और श के साथ संगत)

1 उपसर्ग को NON बेस 8 व्याख्या की तारीख +% N (जैसे 00551454) के लिए बाध्य करना है

एक crontab फ़ाइल में \% का उपयोग करके% से बचने के लिए मत भूलना

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

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

पहले से ही कवर किए गए कैविटीज़ के अलावा, यह केवल तभी काम करेगा जब आपके पास जीएनयू date(जो कि आप संभवतः अधिकांश लिनक्स पर करते हैं, लेकिन बिजीबॉक्स, मानक मैकओएस या अन्य बीएसडी-व्युत्पन्न प्लेटफार्मों पर नहीं)।
ट्रिपल

4

अल-क्स सॉल्यूशन मेरे लिए काम नहीं करता है क्योंकि क्रॉस्टैब कमांड्स बैश में निष्पादित नहीं होते हैं, लेकिन श में मुझे लगता है। क्या काम करता है:

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

मैंने सब कुछ करने की कोशिश की और यह अभी भी मेरे लिए काम नहीं आया। आपने पोस्ट क्यों समझाया, धन्यवाद!
marlar

$[ ... ]वाया बैक के बाद से घटाया हुआ सिंटैक्स है; इस सहस्राब्दी से कुछ के लिए, आप पसंद करेंगे $((RANDOM\%90))mजो POSIX- संगत सिंटैक्स है (लेकिन निश्चित रूप RANDOMसे अभी भी केवल बैश है)।
दोपहर

1

at -f [file] [timespec]

या

echo [command] | at [timespec]

या

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

आदेश

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

Timespec

यहाँ [timespec] व्याकरण है । यह कुछ इस तरह हो सकता है:

  • 24 घंटे समय 4 अंकों पूर्णांक, जैसे के रूप में 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]

ध्यान दें

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


0

उन लोगों के लिए जिन्होंने यहां रास्ता देखा:

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

/etc/anacrontab

और जोड़

RANDOM_DELAY=XX 

जहां XX उन मिनटों की मात्रा है जो आप आधार नौकरी में देरी करना चाहते हैं।

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


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

एक स्क्रिप्ट बनाने के बारे में क्या है जो हर दिन क्रेस्टब को फिर से लिखता है?

  1. वर्तमान क्रोन पढ़ें (ए)
  2. यादृच्छिक समय चुनें (B)
  3. पूर्व क्रोन (ए) को फिर से लिखें, नए यादृच्छिक क्रोन जोड़ें (बी)
  4. पहली बार में इस स्क्रिप्ट को चलाने के लिए क्रोन को जोड़ना सुनिश्चित करें।

2
टिप्पणियों को उत्तरों के रूप में पोस्ट करके प्रतिष्ठा प्रणाली को दरकिनार न करें। आपका टिप्पणी हालांकि काफी अच्छा वास्तव में करने के लिए लग रहा है हो सकता है एक जवाब। मैं हटाने की सलाह देता हूं " मुझे टिप्पणी जोड़ने के लिए प्रतिनिधि नहीं है, लेकिन "।
टेड लिंगमो

1
मैंने इस उत्तर की समीक्षा की और उस हिस्से को याद किया, जहां आप अंत में एक सवाल पूछ रहे हैं (मेरे हिस्से पर मैला काम)। जवाब में सवाल मत पूछो। आपके पास मौजूद प्रश्नों के लिए अपना प्रश्न पोस्ट करें। मैंने आपके अर्ध-प्रश्न को किसी ऐसी चीज़ में कर दिया जो उत्तर के लिए पास हो सकती है।
टेड लिंगमो

1
समझ गया! धन्यवाद। मैं अगली बार अधिक सावधान रहूंगा, कोई बुरा इरादा नहीं था।
मेलोफेलो

1
मुझे यकीन है कि आपका कोई बुरा इरादा नहीं था और आपको अत्यधिक सावधान रहने की आवश्यकता नहीं है। आपने एक संभावित समाधान की रूपरेखा तैयार की - और अंत में थोड़ा ठोकर खाई। कोई चिंता नहीं!
टेड लिंगमो

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
एसओ में आपका स्वागत है। ठीक है, पुराने धागे या नहीं, इसने मुझे भेज दिया ~$info ddऔर मैं समझ सकता हूं कि बाईं ओर क्या चल रहा है |, लेकिन दाईं ओर नहीं बना सकता। इसलिए, overcoming some restrictionsयादृच्छिक मूल्य निर्माण में रुचि रखने वाले मेरे और अन्य लोगों के लिए, आरएचएस की व्याख्या करने में एक पल क्यों नहीं लगता और अपने दृष्टिकोण का उपयोग करने के लिए एक मजबूत पिच बनाएं। स्पष्टीकरण की गहराई दोनों लोगों को आपके द्वारा सुझाई गई प्रक्रिया और इसके लाभों के साथ सहज बनाती है धन्यवाद।
क्रिस

आह अच्छा। ओड उर्फ ​​"ऑक्टल डंप" एक फ़ाइल या स्टड लेता है और बाइनरी डेटा को मानव-पठनीय रूप में डंप करता है। हम चाहते हैं कि हमारा नंबर अहस्ताक्षरित दशमलव (-t u4) के रूप में दिखाया जाए, और पता इंडेक्स (-कोई नहीं) नहीं चाहिए। -N4 निरर्थक है क्योंकि हम केवल 4 बाइट लेते हैं, लेकिन इससे कोई नुकसान नहीं होता है। मुझे आशा है कि यह इसे समझाता है ...
MLP
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.