2012-02-21 11 views
7

एप्लिकेशन के लिए एक बहुत ही सामान्य आवश्यकता प्रत्येक एक्स मिनट/घंटे में एक स्क्रिप्ट चलाने के लिए है। असल में यह कुछ भी जटिल नहीं है, बस कुछ PHP कोड और एक crontab प्रविष्टि।क्रोनबॉज - इसे सही तरीके से कैसे करें?

हालांकि मैंने पिछले कुछ वर्षों में उन cronjobs में से कुछ लिखा है, लेकिन मैंने अभी तक कोई भी सर्वोत्तम प्रथा नहीं देखी है, कम से कम इतना नहीं। प्रत्येक "पृष्ठभूमि प्रसंस्करण" के साथ-साथ कई चीजें विशेष रूप से उत्पादन सेटिंग्स में गलत हो सकती हैं।

उनमें से:

  • एक त्रुटि क्रॉन के निष्पादन के दौरान हुई और स्क्रिप्ट डेटा के प्रसंस्करण के आधे की मृत्यु हो गई
  • cronjob गलती से अन्य प्रक्रिया द्वारा दो बार शुरू किया गया था/उपयोगकर्ता त्रुटि से/जो कुछ भी
  • cronjob अब जिस तरह से संभाल लिया है तो उम्मीद और स्क्रिप्ट फिर से हालांकि इसके प्रसंस्करण डेटा
  • आदि
नहीं किया कहा जाता है

रॉक-ठोस, मजबूत क्रोनबॉज स्क्रिप्ट लिखने के लिए कुछ सर्वोत्तम मूल्य क्या हैं? एक लॉक फ़ाइल लिखते हुए जोर देकर कहा कि केवल एक उदाहरण चलता है, व्यापक लॉगिंग और निगरानी में दस हजार डुप्लिकेट ईमेल भेजने से रोकने के लिए? आपके विचार क्या हैं?

+0

दिलचस्प है कि आप इस पोस्ट किया है क्योंकि मैं शोध किया गया है और एक ही बातों में से कुछ सोच रहा। मेरे मामले में, मैं वास्तव में चिंतित हूं कि मैं लिखने वाली शेल स्क्रिप्ट में अपवाद हैंडलिंग को प्रभावी ढंग से कैसे कार्यान्वित करना है। http: // stackoverflow।कॉम/प्रश्न/6961389/अपवाद-हैंडलिंग-इन-शेल-स्क्रिप्टिंग में उस पर कुछ अच्छी जानकारी है यदि आप उत्सुक हैं। मैं मुख्य रूप से जावा डेवलपर हूं और अपवाद हैंडलिंग बहुत मजबूत है लेकिन * निक्स भूमि में कठिन लगता है। –

+0

यह चलने वाली प्रत्येक स्क्रिप्ट पर निर्भर करेगा, कोई सामान्य उत्तर नहीं है, कुछ को किसी भी आवश्यकता की जांच करने में बहुत मजबूत त्रुटि की आवश्यकता नहीं है ... –

+0

मैंने अपने प्रश्नों और दोषों के विस्तृत औचित्य के साथ अभिनव उत्तरों की प्रत्याशा में इस प्रश्न को बुकमार्क किया है, और मैं "मैं यही करता हूं" उत्तरों से बहुत निराश हूं। – nickb

उत्तर

2

व्यक्तिगत रूप से, जिस तरह से मैं त्रुटियों संभाल बस एक लॉग फ़ाइल को STDERR भेजने के लिए है, और फिर समय-समय पर उस फ़ाइल की जाँच करें। ऐसा करने का एक आसान तरीका है, crontab प्रविष्टि में 2>/pathtolog जोड़ना है।

जहां तक ​​एक ही प्रोग्राम चलाने के डुप्लिकेट हैं, मैं स्क्रिप्ट को कुछ लॉक करने का प्रयास करना पसंद करता हूं (एक फाइल या स्थानीय नेटवर्क पोर्ट)। अगर यह उस लॉक को प्राप्त करने में विफल रहता है, तो स्क्रिप्ट नहीं चलती है। इस प्रकार, यदि मौजूदा स्क्रिप्ट वर्तमान में चल रही है, तो कोई नया समान लॉक प्राप्त नहीं कर सकता है।

0

जिन्हें आप कर सकते के बहुत सारे हैं।

अपनी क्रोन स्क्रिप्ट/बाइनरी सेट करें (स्क्रिप्ट्स जो मुझे लगता है कि वे PHP में लिखे गए हैं) आपकी आवश्यकताओं के आधार पर मालिक या समूह द्वारा निष्पादन योग्य है।

यदि आप यह सुनिश्चित करना चाहते हैं कि उन्हें केवल क्रॉन द्वारा निष्पादित किया गया है तो क्रॉन उपयोगकर्ता बनाएं जो स्क्रिप्ट निष्पादित करने वाला एकमात्र उपयोगकर्ता है। फिर उस उपयोगकर्ता को अपने क्रॉन्टाब एंट्री में चलाने के लिए सेट करें।

अपने क्रॉन स्क्रिप्ट उत्पादन महत्वपूर्ण बातें यह है में

। अपने आउटपुट को टाइमस्टैम्प/डेटास्टैंप के साथ तैयार करें (यह कितनी बार चलता है)। इससे आपकी लॉग फ़ाइल में विशिष्ट समय के लिए grep करना आसान हो जाता है।

अपनी क्रॉन्टाब प्रविष्टि में >> /path/cron.log जोड़कर एक लॉग फ़ाइल में अपनी स्क्रिप्ट का स्टडआउट संलग्न करें।

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

[ Tue Feb 20, 2012 ]: 
[ Tue Feb 20, 2012 ]: Executing mycron.php 
[ Tue Feb 20, 2012 ]: 
[ Tue Feb 20, 2012 ]: Running Query: ""SELECT SUM(`clicks`) FROM `matable`"" 
[ Tue Feb 20, 2012 ]: Running Query: ""INSERT INTO `History` (`date`, `total_clicks`) VALUES(CURDATE(), 12324123) 
[ Tue Feb 20, 2012 ]: 
[ Tue Feb 20, 2012 ]: Finished executing mycron.php. Time taken: 3.462 seconds 
[ Tue Feb 21, 2012 ]: 
[ Tue Feb 21, 2012 ]: Executing mycron.php 
[ Tue Feb 21, 2012 ]: 
[ Tue Feb 21, 2012 ]: Running Query: ""SELECT SUM(`clicks`) FROM `matable`"" 
[ Tue Feb 21, 2012 ]: Running Query: ""INSERT INTO `History` (`date`, `total_clicks`) VALUES(CURDATE(), 10376123) 
[ Tue Feb 21, 2012 ]: 
[ Tue Feb 21, 2012 ]: Finished executing mycron.php. Time taken: 2.998 seconds 

:

आपका लॉग फ़ाइल की तरह कुछ लग सकता है।

+0

cronjob अपने अन्य cronjob के लॉग की जांच करने के लिए, लेकिन क्या होगा अगर वह विफल रहता है? –