न्यूनतम रूप से क्रोन, केवल एक ही उदाहरण सुनिश्चित करता है


9

क्या हर मिनट (या 2, या 5, आदि) पर स्क्रिप्ट चलाने का एक तरीका है, लेकिन केवल अगर यह पहले से ही नहीं चल रहा है?

हमारे पास स्क्रिप्ट का एक सेट है जिसे हर मिनट चलाने की आवश्यकता है। कभी-कभी वे एक सेकंड में शुरू और खत्म कर सकते हैं, दूसरी बार वे 5 मिनट के लिए जा सकते हैं।

एक साथ निष्पादित होने से बचने का हमारा वर्तमान तरीका is_runningप्रत्येक स्क्रिप्ट में एक ध्वज सेट करके है , और यदि यह अभी भी सक्षम है तो बाहर निकलता है। लेकिन यह थोड़ा अविश्वसनीय है (यानी, घातक त्रुटियां झंडे को स्क्रिप्ट के रुकने के बाद भी सक्षम बनी रहेंगी)।

हम अपने छोटे प्रबंधक को लिख सकते हैं, लेकिन मैं सोच रहा हूं कि क्या कोई और फैशनेबल समाधान है जो पहले से मौजूद है।


+1 मुझे इसमें भी दिलचस्पी है। मुझे जवाब नहीं पता है, हालांकि मैं संभावित समाधानों में दिलचस्पी रखता हूं।
सैफ बेनकॉन

एक छोटी सी क्रोन की गंध मुझे "एक
नीचा बना देती है

जवाबों:


9

बेहतर तरीका यह है कि आप flockपिडफाइल के बजाय इसका उपयोग करें । मैनपेज की जाँच करें: झुंड (1) । लाभ यह है कि कोई भी प्रक्रिया कैसे समाप्त होती है / मर जाती है, ताला इसके साथ चला जाता है।


3

मैं वार्नर की फ़ाइल के जवाब से सहमत होना चाहूंगा। हालाँकि, एनाक्रोन की निम्नलिखित विशेषता क्या इसे पूरा करती है?

-s
    Serialize execution of jobs. Anacron will not start a new job before the previous one finished. 

मैंने खुद इसका परीक्षण नहीं किया है, मुझे एनाक्रोन के दस्तावेज पूरी तरह से नहीं मिले हैं ...

अगर आप विशेष रूप से आलसी होना चाहते हैं;; लेकिन एक लॉक / पीआईडी ​​फ़ाइल सबसे अच्छा है।


एनाक्रॉन क्रोन का एक और हालिया संस्करण है, इसलिए इसमें पुराने मानक की तुलना में अधिक विशेषताएं हैं। 'कैसे' के बारे में, यह संभवतः एक SIGCHLD हैंडलर को पंजीकृत करता है, जो एक बच्चे की प्रक्रिया के मरने पर ट्रिगर हो जाता है। इस प्रकार यह चल रहे चिड़ियों का ट्रैक रख सकता है और बस उन नौकरियों को छोड़ सकता है।
जेवियर

@ जेवियर: मैं असहमत हूं "एनाक्रॉन क्रोन का हालिया संस्करण है, इसलिए इसमें पुराने मानक की तुलना में अधिक विशेषताएं हैं।" क्या anacronऔर क्या cronकरना है, इसके बीच कुछ ओवरलैप है, लेकिन वे विभिन्न समस्याओं को हल करते हैं। उपयोग करते हुए cron, आप एक नौकरी कैसे शुरू करेंगे जो एक मशीन के डाउन होने के कारण छूट गई थी? का उपयोग करते हुए anacron, आप 25 दिसंबर या हर 5 मिनट में नौकरी कैसे शुरू करेंगे? (आप, निश्चित रूप से, स्क्रिप्ट वर्कअराउंड कर सकते हैं, लेकिन यह वह नहीं है जो मैं बात कर रहा हूं।)
आगे की सूचना तक रोक दिया गया।

@ काइल: उस विकल्प के कारण एक ही समय में एक ही समय पर चलने के लिए अलग-अलग कार्य निर्धारित होते हैं। यह ओपी की जरूरत के लिए काम कर सकता है, लेकिन यह अन्य नौकरियों को अवरुद्ध करेगा या अन्य नौकरियों को अवरुद्ध करेगा। इसके अलावा, anacronएक दिन से कम अवधि में नहीं चलता है।
अगली सूचना तक रोक दिया गया।

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

1

उस दृष्टिकोण के लिए यह उचित समाधान है। आमतौर पर, एक पीआईडी ​​फ़ाइल का उपयोग किया जाएगा और यह चल रहा है कि बीमा करने के लिए प्रक्रिया के खिलाफ एक पिड परीक्षण किया जाएगा। यदि बासी हो, तो तालाबंदी हटा दी जाएगी और प्रक्रिया वैसे भी चलेगी।

किसी भी अतिरिक्त खुफिया को आमतौर पर सॉफ्टवेयर में ही लिखा जाता है, एक डेमॉन के रूप में, क्रोन में चलाने के विपरीत।


1

यदि आपकी स्क्रिप्ट्स को एक ऐसी भाषा में कोडित किया गया है जो झुंड (2) syscall का समर्थन करता है, तो आप एक फ़ंक्शन कॉल के साथ लॉक फ़ाइल () को लॉक कर सकते हैं। उदाहरण:

यदि आप बैश या अन्य स्क्रिप्टिंग भाषा के साथ फंस गए हैं जो इसका समर्थन नहीं करता है, तो झुंड (1) के साथ पहले से प्रस्तावित समाधान भी ठीक है।

PS किसी भी मामले में, आपको केवल एक बार एक अलग लॉक फ़ाइल बनाना चाहिए (यदि यह पहले से मौजूद नहीं है), और इसे कभी भी हटाएं नहीं। निर्देशिका "/ var / लॉक" ऐसी फ़ाइलों के लिए एक अच्छी जगह है।


0

यह एक समाधान है यदि आपकी स्क्रिप्ट अजगर में चलती है (या आप अगले आदेश से पहले चलाने के लिए एक अजगर कमांड बना सकते हैं) - मैं पिछले हफ्ते इस सटीक समस्या में भाग गया था, और हालांकि मुझे कुछ अच्छे समाधान मिले, मैंने एक बहुत बनाने का फैसला किया सरल और साफ अजगर पैकेज और इसे PyPI पर अपलोड किया। आप निश्चित रूप से इसे लॉक __file__करने के लिए कस्टम संसाधन नाम देने के बारे में सोचने के लिए लॉक नहीं कर सकते थे।

इसके साथ स्थापित करें: pip install quicklock

इसका उपयोग करना बेहद सरल है:

[nate@Nates-MacBook-Pro-3 ~/live] python
Python 2.7.6 (default, Sep  9 2014, 15:04:36)
[GCC 4.2.1 Compatible Apple LLVM 6.0 (clang-600.0.39)] on darwin
Type "help", "copyright", "credits" or "license" for more information.
>>> from quicklock import singleton
>>> # Let's create a lock so that only one instance of a script will run
...
>>> singleton('hello world')
>>>
>>> # Let's try to do that again, this should fail
...
>>> singleton('hello world')
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "/Users/nate/live/gallery/env/lib/python2.7/site-packages/quicklock/quicklock.py", line 47, in singleton
    raise RuntimeError('Resource <{}> is currently locked by <Process {}: "{}">'.format(resource, other_process.pid, other_process.name()))
RuntimeError: Resource <hello world> is currently locked by <Process 24801: "python">
>>>
>>> # But if we quit this process, we release the lock automatically
...
>>> ^D
[nate@Nates-MacBook-Pro-3 ~/live] python
Python 2.7.6 (default, Sep  9 2014, 15:04:36)
[GCC 4.2.1 Compatible Apple LLVM 6.0 (clang-600.0.39)] on darwin
Type "help", "copyright", "credits" or "license" for more information.
>>> from quicklock import singleton
>>> singleton('hello world')
>>>
>>> # No exception was thrown, we own 'hello world'!

नज़र डालें: https://pypi.python.org/pypi/quicklock

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