क्या मैं हर मिनट की तुलना में अधिक बार क्रॉन जॉब चला सकता हूं?


44

क्या स्लीप कमांड के बिना हर 30 सेकंड में क्रोन जॉब चलाना संभव है?


4
आपका इरादा क्या है? क्या क्रोन इसके लिए उपयोग करने के लिए सही उपकरण है?
मैनुअल फ़ुक्स

अच्छा प्रश्न।
प्रीत संघ

उदाहरण के लिए, मैं वर्तमान में अपनी डेस्कटॉप पृष्ठभूमि तस्वीर को बदलने के लिए क्रोन का उपयोग कर रहा हूं, देशी पृष्ठभूमि छवि स्विचर की सीमाओं को दरकिनार करने के लिए (उपनिर्देशिकाओं में डाइविंग नहीं)। अगर मैं प्रति मिनट एक से अधिक बार स्विच करना चाहता था, तो मैं इस क्रोन सीमा में चला जाऊंगा। (हालांकि देशी बीजी स्विचर की एक ही सीमा है)
दान

जवाबों:


36

यदि आपके कार्य को बार-बार चलाने की आवश्यकता है, तो क्रोन गलत उपकरण है। इस तथ्य के अलावा कि यह केवल उन नौकरियों को लॉन्च नहीं करेगा जो अक्सर होती हैं, आप कुछ गंभीर समस्याओं का भी जोखिम उठाते हैं यदि लॉन्च के बीच के अंतराल की तुलना में नौकरी को चलने में अधिक समय लगता है। अपने काम को फिर से शुरू करने और लगातार चलाने के लिए फिर से शुरू करें, फिर यदि आवश्यक हो तो क्रॉन से लॉन्च करें (यह सुनिश्चित करते हुए कि यह पहले से ही चल रहा है तो इसे फिर से लॉन्च नहीं करेगा)।


18
भाग "आप कुछ गंभीर समस्याओं को भी जोखिम में डालते हैं यदि लॉन्च के बीच के अंतराल से काम चलने में अधिक समय लगता है।" यह सच नहीं है और अगर यह समान रूप से उन नौकरियों के लिए लागू होता है जो हर 5 मिनट, हर घंटे या हर महीने उस मामले के लिए चलती हैं। उस समस्या के समाधान हैं (एक पीडफाइल या जो कुछ भी और यह जाँचना कि क्या नौकरी चलने से पहले ही चल रही है)। तो मुद्दा यह है कि क्रोन सिर्फ उस आवृत्ति की अनुमति नहीं देगा, लेकिन यह कहना गलत है कि प्रत्येक कार्य को एक मिनट से कम समय में निष्पादित करने में आंतरिक रूप से कुछ गलत है।
मैट नोवो

2
मेरा मतलब था कि अगर आप पिडफाइल का उपयोग नहीं करते हैं। यदि आपकी नौकरी हर X मिनट चलती है, और समाप्त होने में X मिनट से अधिक समय लगता है, तो आप नौकरियों को ढेर कर देंगे। यदि आपकी नौकरी भी किसी प्रकार के संसाधन (सीपीयू, नेटवर्क / डिस्क बैंडविड्थ, आदि) द्वारा सीमित है, तो एक बार में अधिक चलने से इसे खत्म होने में अधिक समय लगेगा, और अंततः आपका कंप्यूटर एक गड़बड़ी गड़बड़ में बदल जाएगा।
शाम

2
आप run-oneएक प्रोग्राम सुनिश्चित करने के लिए उपयोग कर सकते हैं / यहां तक ​​कि एक PHP स्क्रिप्ट भी डुप्लिकेट उदाहरण शुरू नहीं कर रहा है। sudo apt-get install run-oneऔर इसे कॉल करेंrun-one <normal command>
kouton

3
जैसा कि नीचे दिए गए शो में जवाब दिया गया है, यह बहुत अच्छी तरह से संभव है, भले ही थोड़ा हैकिश हो। तुम क्यों गलत कर रहे हो !!!! यहां स्वीकृत उत्तर, जब यह प्रश्न का उत्तर नहीं देता है?
कोई

@ मन्त्रीूर क्योंकि प्रश्न के लेखक ने इसे उपयोगी पाया और इसे स्वीकृत उत्तर के रूप में चिह्नित किया? :) लेकिन गंभीरता से, हालांकि, आप पहले से ही समस्या की पहचान कर चुके हैं: कई अन्य समकालीन जवाबों ने हैकिश समाधानों का प्रस्ताव दिया है जो उत्पादन प्रणाली में उपयोग करने के लिए नासमझ होगा। (इसके अलावा, ध्यान रखें कि कई अन्य उत्तर केवल प्रश्न पूछे जाने के वर्षों बाद दिखाए गए थे, इसलिए वे अभी तक स्वीकार करने के लिए उपलब्ध नहीं थे!)
duskwuff

37

लिनक्स कमांड के सबसे रचनात्मक दुरुपयोग के लिए उम्मीदवार :

nohup watch -n 30 --precise yourprog >/dev/null &

यदि yourprogइसमें शामिल हैं:

date +%M.%S.%N >> yourprog.out

तब yourprog.outलग सकता है:

50.51.857291267
51.21.840818353
51.51.840910204
52.21.840513307
52.51.842455224
53.21.841195858
53.51.841407587
54.21.840629676

सटीक स्तर का एक बहुत अच्छा संकेत है।

यहाँ कमांड के कुछ हिस्सों की व्याख्या है:

  • nohup- यह इस आदेश का पालन करता है, watchइस मामले में, टर्मिनल से बाहर निकलने पर बाहर निकलने से।
  • watch- यह प्रोग्राम बार-बार एक कमांड चलाता है। सामान्य रूप से कमांड से आउटपुट का पहला स्क्रीनफुल हर बार watchकमांड रन करने पर प्रदर्शित होता है ।
  • -n 30- अंतराल जिस पर कमांड चलाना है। इस मामले में यह हर तीस सेकंड में है।
  • --precise- इस विकल्प के बिना, अंतराल सेकंड के बादwatch कमांड चलाता है । इसके साथ, यदि संभव हो तो कमांड की प्रत्येक शुरुआत अंतराल पर शुरू होती है। यदि इस विकल्प को उदाहरण में निर्दिष्ट नहीं किया गया था, तो समय हर बार और बाद में 30 सेकंड से अधिक हो जाएगा, क्योंकि कमांड को लॉन्च करने और निष्पादित करने में लगने वाले समय के कारण । yourprog
  • yourprog- watchनिष्पादित करने के लिए प्रोग्राम या कमांड लाइन । यदि कमांड लाइन में शेल (जैसे स्थान या अर्धविराम) के लिए वर्ण विशेष हैं, तो इसे उद्धृत करना होगा।
  • >/dev/null- से अधिक से अधिक watchएक फ़ाइल द्वारा चलाए जा रहे कमांड के आउटपुट को पुनर्निर्देशित करता है /dev/null। वह फाइल उसमें लिखे किसी भी डाटा को डिस्क्राइब करती है। यह आउटपुट को स्क्रीन पर लिखे जाने से रोकता है या, चूंकि nohupइसका उपयोग किया जा रहा है, यह आउटपुट को किसी फ़ाइल में भेजे जाने से रोकता है nohup.out
  • &- watchकमांड को बैकग्राउंड में चलाया जाता है और कंट्रोल को टर्मिनल या पैरेंट प्रोसेस में लौटाया जाता है।

ध्यान दें कि nohup, आउटपुट का पुनर्निर्देशन और &पृष्ठभूमि नियंत्रण ऑपरेटर के लिए विशिष्ट नहीं हैं watch

यहाँ उदाहरण yourprogस्क्रिप्ट की व्याख्या है :

  • date- वर्तमान दिनांक और / या समय आउटपुट। यह उन्हें सेट भी कर सकता है।
  • +%M.%S.%N- यह dateउपयोग करने के लिए आउटपुट स्वरूप को निर्दिष्ट करता है । %Mवर्तमान मिनट है, %Sवर्तमान दूसरा है और %Nवर्तमान नैनोसेकंड है।
  • >> yourprog.out- यह dateकमांड के आउटपुट को एक फाइल में रीडायरेक्ट करता है जिसे कहा जाता है yourprog.out। पिछली सामग्री को अधिलेखित किए जाने के बजाए दोहरे से अधिक आउटपुट फ़ाइल को प्रत्येक आह्वान पर फ़ाइल में जोड़ा जाता है।

संपादित करें :

संभवतः एक और चीज जिसका दुरुपयोग किया जा सकता है (या शायद यह एक वैध उपयोग है) सिस्टमड टाइमर है।

एक क्रोन प्रतिस्थापन और क्रोन बनाम सिस्टमड टाइमर के रूप में सिस्टमड / टाइमर देखें ।

मैं जल्द ही एक उदाहरण पोस्ट करने की कोशिश करूंगा।


6
मैं शुद्ध गाल के लिए +1 दे रहा हूं
मैट सीमन्स

2
इस उत्तर के साथ थोड़ा और स्पष्टीकरण देना अच्छा होगा। नॉहप कमांड मेरे लिए नया है। इंटरनेट बताता है कि यह हैंगअप सिग्नल को नजरअंदाज करना है। जो अभी भी मुझे भ्रमित करता है।
16:23 पर दान

2
@donquixote: यह पहचानना महत्वपूर्ण है कि मेरे जवाब में एक पूरे के रूप में कमांड एक अनुशंसित चीज़ नहीं है, इसलिए "दुरुपयोग" शब्द का उपयोग किया जाता है। हालांकि, आपके लिए चीजों को स्पष्ट करने के लिए चूंकि उपयोगी तकनीकें शामिल हैं, इसलिए मैं कुछ का वर्णन करने की कोशिश करूंगा। &कमांड को पृष्ठभूमि में चलाने का कारण बनता है, कमांड प्रॉम्प्ट पर तुरंत नियंत्रण लौटाता है। nohupकमांड का उपयोग करने से बैकग्राउंड प्रोसेस (इस मामले में watch) हैंगअप सिग्नल को नजरअंदाज करने का कारण बनता है जो तब भेजा जाता है जब शेल टर्मिनल से बाहर निकलते समय बाहर निकलता है। ...
डेनिस विलियमसन

1
... आउटपुट का उपयोग करके पुनर्निर्देशन से आउटपुट का >/dev/nullत्याग हो जाता है और एक nohup.outफ़ाइल के निर्माण को रोकता है जो अन्यथा तब उत्पन्न होती है जब मानक आउटपुट एक टर्मिनल होता है।
डेनिस विलियमसन

1
@donquixote: अब से केवल 30 सेकंड नहीं, हर 30 सेकंड में। बाकी यह है कि इसे और अधिक क्रोन की तरह पृष्ठभूमि में अप्राप्य चलाया जाए। यदि आप उपयोग करना चाहते हैं sleep, तो आपको एक लूप लिखना होगा ताकि प्रक्रिया दोहराई जाएगी ( watchक्या यह आपके लिए दोहराता है, जैसा कि करता है cron)। आपको अभी भी nohupऔर की आवश्यकता होगी &sleepसमय के बहाव के साथ एक अतिरिक्त समस्या होगी। इससे बचने का --preciseविकल्प watch। इसके बिना या sleepलूप में उपयोग करते समय, समय अंतराल के पास कमांड या स्क्रिप्ट को चलाने के लिए समय लगता है, इसलिए प्रत्येक रन बाद में और बाद में मिलता है ...
डेनिस विलियमसन

13

क्रोन को प्रत्येक मिनट पर जागने के लिए डिज़ाइन किया गया है, इसलिए इसे कुछ हैकिंग के बिना करना संभव नहीं है, उदाहरण के लिए नींद जैसा कि आपने उल्लेख किया है।


10
* * * * * /path/to/program
* * * * * sleep 30; /path/to/program

अपने प्रोग्राम में कुछ लिखना न भूलें, ताकि यह बाहर निकल जाए अगर कोई पिछला उदाहरण पहले से चल रहा हो।

#!/bin/sh

if ln -s "pid=$$" /var/pid/myscript.pid; then
  trap "rm /var/pid/myscript.pid" 0 1 2 3 15
else
  echo "Already running, or stale lockfile." >&2
  exit 1
fi

बेशक, यह अभी भी विफलता के लिए एक बहुत छोटा अवसर छोड़ता है, इसलिए अपने पर्यावरण के लिए बेहतर समाधान के लिए Google को खोजें।


यह पूछा गया है:without a sleep command
फिलिप

10
यदि नींद की आज्ञा का उपयोग किया जाता है, तो इस सवाल का पता लगाने वाले अन्य आगंतुक :)
21:39 पर

8

आप इसे थर्ड पार्टी सॉफ्टवेयर के साथ कर सकते हैं।

एक विकल्प जो मेरे लिए अच्छी तरह से काम किया है वह अक्सर क्रोन है

यह मिलीसेकंड परिशुद्धता की अनुमति देता है और यह आपको मौजूदा निष्पादन से बाहर निकलने तक अगले निष्पादन को स्थगित करने का विकल्प देता है।


1
बार-बार क्रोन ने हमारे लिए भी अच्छा काम किया है और हमारी कई उत्पादन प्रणालियों को अधिकार दिया है। हमने इसके साथ कभी कोई समस्या नहीं की है।
होमर 6

2

मुझे कुछ चिंताएँ हैं:

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

(२) स्क्रिप्ट में संभवतः बहुत अधिक ओवरहेड हो सकता है, और जितना आप चाहते हैं उससे अधिक सिस्टम संसाधनों का उपभोग कर सकते हैं। यह सच है अगर आप कई अन्य सिस्टम गतिविधियों के खिलाफ प्रतिस्पर्धा कर रहे हैं।

इस प्रकार एक पोस्टर के रूप में इसे रखा गया है, इस मामले में मैं गंभीरता से अतिरिक्त प्रक्रियाओं के साथ एक डेमॉन में डालने पर विचार करूंगा ताकि यह सुनिश्चित हो सके कि यह आपके संचालन के लिए महत्वपूर्ण है।


1

इस कार्य के लिए मेरा सबसे सरल और पसंदीदा समाधान:

क्रोन प्रविष्टि:
* * * * * flock -w0 /path/to/script /path/to/script

स्क्रिप्ट:
while true;do echo doing something; sleep 10s;done

आलसी विकल्प: :)

* * * * * flock -w0 /path/to/log watch -n 10 echo doing >> /path/to/log

या

* * * * * flock -w0 /path/to/log watch -n 10 /path/to/script

पेशेवरों

  • flockकमांड का उपयोग एक ही समय में कई उदाहरणों द्वारा स्क्रिप्ट को चलाने से बचता है। यह ज्यादातर मामलों में बहुत महत्वपूर्ण हो सकता है।
  • flockऔर watchकमांड अधिकांश लिनक्स इंस्टॉल पर उपलब्ध है

विपक्ष

  • इस तरह की "सेवा" को रोकने के लिए दो चरणों की आवश्यकता है
    • क्रोन प्रविष्टि पर टिप्पणी करें
    • स्क्रिप्ट या watchकमांड को मारें

2
क्या कोई pls इसे एक लिनक्स नौसिखिया को समझा सकता है - पेशेवरों और विपक्ष के साथ? धन्यवाद ..
a20

@asvany मुझे लगता है कि मुझे यह समाधान पसंद है लेकिन a20 के रूप में, क्या आप लिनक्स "ग्रीन" के लिए कुछ स्पष्टीकरण दे सकते हैं? Ty।
जोलाज

0

एक समाधान, अगर यह आपकी अपनी स्क्रिप्ट के लिए है या यदि आप इसे लपेट सकते हैं:

  1. प्रारंभ समय याद रखें।
  2. यदि एक लॉक फ़ाइल, जिसे आप बाद में स्पर्श करेंगे, मौजूद है और स्क्रिप्ट 60 सेकंड के लिए नहीं चल रही है, एक सेकंड प्रतीक्षा करें और फिर से जांचें। (जैसे / सोते समय) *
  3. यदि 60 सेकंड बीतने के बाद भी लॉक फ़ाइल मौजूद है, तो बासी लॉक चेतावनी के साथ बाहर निकलें।
  4. लॉक फ़ाइल को स्पर्श करें।
  5. जबकि स्क्रिप्ट 60 सेकंड के लिए नहीं चल रही है, वांछित नींद की अवधि के साथ अपने वास्तविक कार्य को लूप करें।
  6. लॉक फ़ाइल हटाएँ।
  7. मिन्टली क्रोन के रूप में जोड़ें।
  8. बॉब तुम्हारे चाचा हैं।

डेमॉन के निर्माण और निगरानी की तुलना में कम सिरदर्द।

* यदि आप PHP का उपयोग कर रहे हैं, तो clearstatcache () याद रखें।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.