सवाल चल रहे डुप्लिकेट क्रॉन नौकरियों को रोकें


मैंने प्रत्येक मिनट चलाने के लिए एक क्रॉन नौकरी निर्धारित की है लेकिन कभी-कभी स्क्रिप्ट को खत्म होने में एक मिनट से अधिक समय लगता है और मैं नहीं चाहता कि नौकरियां एक-दूसरे पर "ढेर" शुरू करें। मुझे लगता है कि यह एक सहमति समस्या है - यानी स्क्रिप्ट निष्पादन पर पारस्परिक रूप से अनन्य होना आवश्यक है।

समस्या को हल करने के लिए मैंने स्क्रिप्ट को किसी विशेष फ़ाइल के अस्तित्व के लिए देखा ("lockfile.txt") और अगर यह मौजूद है या बाहर निकलें touch अगर यह नहीं करता है। लेकिन यह एक सुंदर लुभावनी semaphore है! क्या कोई सर्वोत्तम अभ्यास है जिसके बारे में मुझे पता होना चाहिए? क्या मुझे इसके बजाय एक डिमन लिखा होगा?


81
2017-11-09 11:32


मूल




जवाब:


ऐसे कुछ कार्यक्रम हैं जो इस सुविधा को स्वचालित करते हैं, परेशानियों और संभावित बग को स्वयं से करने से दूर लेते हैं, और दृश्यों के पीछे झुंड का उपयोग करके बालों की लॉक समस्या से बचते हैं, (यदि आप केवल स्पर्श का उपयोग कर रहे हैं तो जोखिम है) । मैंने उपयोग किया है lockrun तथा lckdo अतीत में, लेकिन अब वहाँ है flock(1) (उपयोग-लिनक्स के नए संस्करणों में) जो बहुत अच्छा है। इसका उपयोग करना वास्तव में आसान है:

* * * * * /usr/bin/flock -n /tmp/fcj.lockfile /usr/local/bin/frequent_cron_job

109
2017-11-09 11:57



lckdo अधिकutils से हटा दिया जा रहा है, अब झुंड (1) उपयोग-लिनक्स में है। और वह पैकेज मूल रूप से लिनक्स सिस्टम में अनिवार्य है, इसलिए आपको इसकी उपस्थिति पर भरोसा करने में सक्षम होना चाहिए। उपयोग के लिए, नीचे देखें। - jldugger
हाँ, झुंड अब मेरा पसंदीदा विकल्प है। मैं सूट के लिए भी अपना जवाब अपडेट करूंगा। - womble♦
क्या किसी के बीच का अंतर पता है flock -n file command तथा flock -n file -c command ? - Nanne
@Nanne, मुझे यह सुनिश्चित करने के लिए कोड जांचना होगा, लेकिन मेरा शिक्षित अनुमान यह है -c निर्दिष्ट शेल को एक खोल के माध्यम से चलाता है (मैनपेज के अनुसार), जबकि "नंगे" (गैर--c) बस फॉर्म execआदेश दिया गया है। खोल के माध्यम से कुछ डालने से आप शैल जैसी चीजें कर सकते हैं (जैसे कि एकाधिक कमांड को अलग करना ; या &&), लेकिन यदि आप अविश्वसनीय इनपुट का उपयोग कर रहे हैं तो आपको खोल विस्तार हमलों तक भी खुलता है। - womble♦
यह एक तर्क था (काल्पनिक) frequent_cron_job आदेश जो इसे दिखाने की कोशिश करता था हर मिनट चल रहा था। मैंने इसे हटा दिया है क्योंकि इसमें कुछ भी उपयोगी नहीं जोड़ा गया है, और भ्रम पैदा हुआ है (आपका, अगर किसी और के वर्षों में नहीं है)। - womble♦


खोल में सबसे अच्छा तरीका उपयोग करना है झुंड (1)

(
  flock -x -w 5 99
  ## Do your stuff here
) 99>/path/to/my.lock

27
2017-11-09 11:45



मैं एफडी पुनर्निर्देशन के एक मुश्किल उपयोग को ऊपर नहीं उठा सकता। यह बहुत ही कमाल से भयानक है। - womble♦
बैश या जेडएसएच में मेरे लिए पार्स नहीं है, के बीच की जगह को खत्म करने की जरूरत है 99 तथा > इसलिए यह 99> /... - Kyle Brandt♦
@ जेवियर: इसका मतलब यह नहीं है कि यह मुश्किल और आर्केन नहीं है, बस यही है दस्तावेज, मुश्किल, और आर्केन। - womble♦
क्या होगा यदि आप चल रहे हों या किसी भी तरह से प्रक्रिया को मारने के दौरान पुनरारंभ करें? क्या यह हमेशा के लिए बंद कर दिया जाएगा? - Alex R
मैं समझता हूं कि यह संरचना एक विशेष लॉक बनाती है लेकिन मैं यह कैसे पूरा कर रहा है के मैकेनिक्स को समझ नहीं पा रहा हूं। इस जवाब में '99' का कार्य क्या है? किसी को भी यह समझाने की परवाह है? धन्यवाद! - Asciiom


वास्तव में, flock -n इसके बजाए इस्तेमाल किया जा सकता है lckdo*, तो आप कर्नेल डेवलपर्स से कोड का उपयोग करेंगे।

निर्भर होना गर्भ का उदाहरण, आप कुछ लिखेंगे:

* * * * * flock -n /some/lockfile command_to_run_every_minute

बीटीडब्ल्यू, कोड को देखकर, सब कुछ flock, lockrun, तथा lckdo वही काम करें, इसलिए यह केवल एक मामला है जो आपके लिए सबसे आसानी से उपलब्ध है।

* चूंकि, लेखन के समय मेरी प्रतिष्ठा दी गई है, मैं न तो पिछले उत्तरों पर संपादित और न ही टिप्पणी कर सकता हूं, मुझे इसे एक अलग उत्तर के रूप में लिखना है।


21
2017-11-19 22:43





आप लॉक फ़ाइल का उपयोग कर सकते हैं। जब स्क्रिप्ट शुरू होती है और इसे समाप्त होने पर हटा दें तो यह फ़ाइल बनाएं। स्क्रिप्ट, इससे पहले कि यह मुख्य दिनचर्या चलाता है, जांच करनी चाहिए कि लॉक फ़ाइल मौजूद है या नहीं और तदनुसार आगे बढ़ें।

लॉकफाइल का उपयोग इनक्रिप्ट्स द्वारा और यूनिक्स सिस्टम में कई अन्य अनुप्रयोगों और उपयोगिताओं द्वारा किया जाता है।


2
2017-11-09 11:36



यह है केवल जिस तरह से मैंने कभी इसे लागू किया है, व्यक्तिगत रूप से। मैं एक ओएसएस परियोजना के लिए दर्पण के रूप में रखरखाव के सुझाव के अनुसार उपयोग करता हूं - warren


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


1
2017-11-09 11:45



मैं दिल से इस से असहमत हूं। यदि आपके पास समय-समय पर चलने की ज़रूरत है, तो इसे एक डिमन बनाना एक "अखरोट के लिए स्लेजहैमर" समाधान है। दुर्घटनाओं को रोकने के लिए लॉकफाइल का उपयोग करना एक बिल्कुल उचित समाधान है जिसे मुझे कभी भी समस्या का सामना नहीं करना पड़ा। - womble♦
@ मैं सहमत हूं; लेकिन मुझे स्लेजहैमर के साथ नट्स को तोड़ना पसंद है! :-) - wzzrd


यदि आप स्क्रिप्ट को पिछले रन के पूरा होने या नहीं करने के लिए प्रतीक्षा करना चाहते हैं तो आपने निर्दिष्ट किया है। "मैं नहीं चाहता कि नौकरियां" एक-दूसरे पर "खड़ी हो जाएं", मुझे लगता है कि आप यह कह रहे हैं कि आप स्क्रिप्ट को बाहर निकलने के लिए बाहर निकलना चाहते हैं,

इसलिए, यदि आप lckdo या इसी तरह पर निर्भर नहीं करना चाहते हैं, तो आप यह कर सकते हैं:


PIDFILE=/tmp/`basename $0`.pid

if [ -f $PIDFILE ]; then
  if ps -p `cat $PIDFILE` > /dev/null 2>&1; then
      echo "$0 already running!"
      exit
  fi
fi
echo $$ > $PIDFILE

trap 'rm -f "$PIDFILE" >/dev/null 2>&1' EXIT HUP KILL INT QUIT TERM

# do the work


1
2017-11-09 14:33



धन्यवाद आपका उदाहरण उपयोगी है - मैं चाहता हूं कि स्क्रिप्ट पहले से चलने पर बाहर निकलें। उल्लेख करने के लिए धन्यवाद ickdo - ऐसा लगता है कि यह चाल है। - Tom


यदि आपके पिछले उदाहरण अभी भी चल रहे हैं तो आपके क्रॉन डिमन को नौकरियों का आह्वान नहीं करना चाहिए। मैं एक क्रॉन डिमन का डेवलपर हूं dcron, और हम विशेष रूप से इसे रोकने की कोशिश करते हैं। मुझे नहीं पता कि कैसे विक्सी क्रॉन या अन्य डिमोन इसे संभालते हैं।


1
2018-02-17 15:59