2012-03-12 28 views
10

रूबी 1.9.x में, क्या करने के लिए या तो मेरी रूबी स्क्रिप्ट को फिर से चलाएँ, या पिछले उदाहरण समाप्त होने की प्रतीक्षा करने की अनुमति नहीं एक आसान तरीका हो सकता है? **उसी रूबी स्क्रिप्ट के समवर्ती उदाहरणों को कैसे सीमित करें?

मैं गन्दा फ़ाइल-लॉकिंग से बचने के लिए आशा करती हूं कि या तालिका की जांच की प्रक्रिया।

क्या global mutex या सैमफोर पहले से ही कोर में कुछ है? मैंने देशी Mutex का अध्ययन किया लेकिन यह केवल एक रूबी प्रक्रिया के भीतर धागे पर लागू होता है, न कि विभिन्न प्रक्रियाओं में।

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

उत्तर

2

यह आम तौर पर स्क्रिप्ट में नहीं, फ्लैग-फ़ाइल की जांच करके और फिर से लॉन्च करने की कोशिश नहीं कर रहा है, ओएस स्तर पर हल किया जाता है।

लेकिन, यदि आप स्क्रिप्ट में जांचना चाहते हैं, तो किसी ज्ञात स्थान पर सेमफोर फ़ाइल देखें। यदि यह मौजूद है और यह आपके लॉन्च विंडो में फ़िट होने वाली किसी भी समय विंडो के भीतर नहीं है, तो फ़ाइल को हटाएं और एक नया बनाएं। यदि यह आपकी टाइम विंडो में है तो बाहर निकलें।

यदि आप क्रॉन-प्रकार तंत्र का उपयोग करके लॉन्च नहीं करते हैं तो आप फ़ाइल-लॉकिंग का उपयोग कर सकते हैं, या फ़ाइल में टाइमस्टैम्प संग्रहीत कर सकते हैं, या कई अन्य चेक का उपयोग कर सकते हैं। प्रत्येक दृष्टिकोण में इसके प्लस और माइनस होते हैं।

आप इंटरप्ट्स को जाल करना चाहते हैं ताकि जब आप नियंत्रण-सी से बाहर निकलेंगे तो आप उस फ़ाइल को भी मिटा दें।

दाईं ओर संबंधित प्रश्नों के माध्यम से पढ़ें। हालांकि वे कई अन्य भाषाओं को कवर कर रहे हैं, सुझाए गए उत्तर सभी भाषाओं में उनके आसपास काम करने के लिए समस्याओं और संभावित तरीकों को समझने में मदद करेंगे।

+0

मैं पहले से ही अपने रूबी को बैश स्क्रिप्ट के साथ लपेटता हूं जो स्वयं उपयोग करते हैं कोड '[-z "$ (pidof -x -o% PPID -o $$ $ {0 ## * /})"] || exec echo "$ (date) $ 0: $$ पहले ही पीआईडी ​​की गंध करता है: $ (pidof -x $ 0), ... अलविदा !!" हालांकि यह अन्य उद्देश्यों को पूरा करता है। रुबी के भीतर पहले से ही एक बेहतर समाधान है जो लिखने के लिए किसी भी निश्चित फ़ाइल को लॉक करना है। '/ Tmp/scriptname.rb.lock'। बाहर निकलने पर या यहां तक ​​कि यदि मेरा कोड दुर्घटनाग्रस्त हो जाता है (जो अक्सर अपवाद उठाता है) तो सिस्टम उस लॉक को साफ़ कर देगा। मैं उस हैक के साथ तब तक जाऊंगा जब तक कि वैश्विक सेमफोरों के लिए एक साफ, मूल इंटरफ़ेस न हो - जो मुझे किसी भी तरह की आवश्यकता होगी। – Marcos

5

यह बहुत ही कम कोड अपनी स्क्रिप्ट के नाम पर/tmp में एक lockfile जब तक जगह में फ्रीज होगा विशेष रूप से बंद कर दिया जाता है:

File.open("/tmp/#{File.basename $0}.lock", File::RDWR|File::CREAT, 0644).flock(File::LOCK_EX) 

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

timeout 1m ./myrubyscript.rb 

के साथ मेरी रूबी कार्यक्रम कॉल कर सकते हैं। (उस उदाहरण में, myrubyscript.rb 1 मिनट के बाद समाप्त हो जाएगा या नहीं और उसे फ़ाइल लॉक करने के लिए जो लिखा गया था उसे जारी रखने के लिए मिला है।)