कई क्रोन जॉब्स चलाएं जहां एक काम में लंबा समय लगता है


17

मेरे पास क्रोन नौकरियों के बारे में निम्नलिखित सामान्य प्रश्न हैं।

मान लीजिए कि मेरे पास निम्नलिखित हैं crontab:

* 10 * * * * someScript.sh
* 11 * * * * someScript2.sh
30 11 */2 * * someScript3.sh  <-- Takes a long time let's say 36 hours.
* 12 * * * someScript4.sh

क्या उचित समय में शेष नौकरियों को चलाने के लिए पर्याप्त स्मार्ट है? उदाहरण के लिए, लंबी स्क्रिप्ट को समाप्त करने की आवश्यकता नहीं है?

इसके अलावा, क्या होगा यदि प्रारंभिक लंबी स्क्रिप्ट अभी भी चल रही है और इसे फिर से क्रोन कहा जाता है?

धन्यवाद!


क्रॉन को परवाह नहीं है कि नौकरियां कितनी देर चलती हैं; यह अतिरिक्त प्रतियां चलाएगा।
जेफ स्कालर

कृपया सुनिश्चित करें कि आपके प्रश्न ठीक से प्रारूपित हैं।
Bram

जवाबों:


32

प्रत्येक क्रोन नौकरी को आपके द्वारा निर्दिष्ट किसी भी अन्य नौकरियों से स्वतंत्र निष्पादित किया जाता है। इसका अर्थ है कि आपकी लंबी-चौड़ी स्क्रिप्ट अन्य नौकरियों को निर्दिष्ट समय पर निष्पादित होने से रोक नहीं पाएगी।

यदि आपकी कोई स्क्रिप्ट अभी भी अपने अगले निर्धारित क्रोन अंतराल पर निष्पादित हो रही है, तो आपकी स्क्रिप्ट का दूसरा, समवर्ती, उदाहरण निष्पादित किया जाएगा।

आपकी स्क्रिप्ट क्या करती है, इसके आधार पर इसके अप्रत्याशित परिणाम हो सकते हैं। मैं फ़ाइल लॉकिंग पर विकिपीडिया लेख को पढ़ने की सलाह दूंगा , विशेषकर लॉक फ़ाइलों पर अनुभाग । एक लॉक फ़ाइल यह संकेत देने के लिए एक सरल तंत्र है कि एक संसाधन - आपके मामले में someScript3.shस्क्रिप्ट - वर्तमान में 'लॉक' है (यानी उपयोग में) और तब तक फिर से निष्पादित नहीं किया जाना चाहिए जब तक कि लॉक फ़ाइल को हटा नहीं दिया जाता है।

अपनी स्क्रिप्ट में लॉक फ़ाइल को लागू करने के तरीकों के विवरण के लिए निम्नलिखित प्रश्न के उत्तर पर एक नज़र डालें:


8

यह निश्चित नहीं है कि उपयुक्त समय से आपका क्या मतलब है। जिस समय वह ऐसा करने के लिए नियत समय पर क्रोन रोजगार शुरू करेगा। यह अन्य अनुसूचित नौकरियों की जाँच नहीं करता है और न ही नौकरी के अन्य उदाहरणों की जाँच करता है।

तो आप जो भी वैध नौकरियों को परिभाषित करते हैं वह परिभाषित समय पर शुरू किया जाएगा। परिभाषित अंतराल से अधिक समय तक चलने वाली कोई भी नौकरी कई बार शुरू की जाएगी। यह जिम्मेदारी है कि जिसने भी काम लिखा है उसे रोकने के लिए वास्तव में कई बार चलने से यदि आवश्यक हो। जैसे लॉक फ़ाइल या पीआईडी ​​फ़ाइल या किसी चीज़ की जाँच करके।

प्रक्रियाओं की मात्रा के लिए स्पष्ट सीमाएं हैं जो समानांतर में चल सकती हैं लेकिन वे क्रोन विशिष्ट नहीं हैं।


6

अन्य उत्तरों के अलावा, विशेष रूप से @soulcake द्वारा पोस्ट किया गया लिंक: यदि आप बहुत कम अंतराल के साथ एक लंबे समय तक चलने वाले कमांड को शेड्यूल करते हैं, तो क्रोन खुशी से दूसरे को पहले पूरा होने से पहले निष्पादित करेगा (जब तक कि कमांड में किसी प्रकार का म्यूटेक्स लागू नहीं होता है) ।

यह अक्सर मूल आदेश को और भी धीमा कर देता है, जिससे पिछले उदाहरणों को पूरा होने से पहले चलाया जा रहा है, या यह अन्य कारणों से अवांछनीय हो सकता है।

सामान्य तरीके से रोकने के लिए एक गार्ड के साथ कमांड चलाने की शर्त है जो यह सुनिश्चित करता है कि एक पिछली कमांड नहीं चल रही है। उदाहरण के लिए:

10 * * * * pgrep my_slow_command >/dev/null || /usr/local/bin/my_slow_command

सुनिश्चित करें कि pgrep कमांड के नाम से मेल खाता है, जब यह चलता है, उदाहरण के लिए अजगर स्क्रिप्ट में निष्पादन योग्य के नाम के रूप में अजगर है, जो संभवत: विशिष्ट नहीं है और आपको अजगर के स्क्रिप्ट नाम के साथ भी मेल खाना होगा।

10 * * * * pgrep -f my_script.py || /usr/local/bin/my_script.py

(pgrep बिना '-f' विकल्प बैश स्क्रिप्ट नामों से मेल खाता है, हालांकि)

यदि आप किसी कारण से pgrep का उपयोग नहीं कर सकते हैं:

10 * * * * ps ax | grep [m]y_command || /usr/local/bin/my_command

ब्रैकेट का उपयोग grep कमांड के मिलान से बचने के लिए किया जाता है।


0

मैं उपयोग करता हूं flock

* * * * * exec flock --nonblock .ws_client.lock -c ws_client.py >& /tmp/ws_client.out
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.