एक लाइन में
एक लाइन में कहें तो, cron expression कैरेक्टर्स की एक छोटी सी स्ट्रिंग है जो एक रिकरिंग शेड्यूल को डिफाइन करती है, और कंप्यूटर को बताती है कि कोई ऑटोमेटेड टास्क कब चलाना है।
यह क्या समस्या हल करता है
डिजिटल दुनिया के उस पुराने ज़माने में (यानि 1970 के दशक में), अगर आप चाहते थे कि कंप्यूटर कोई काम अपने आप करे—मान लीजिए, आधी रात को टेम्परेरी फ़ाइलें साफ़ करना—तो आपको कुछ जुगाड़ लगाना पड़ता था। आप शायद एक बेढंगी सी स्क्रिप्ट लिखते जो एक लूप में चलती, समय की जाँच करती, और फिर थोड़ी देर के लिए सो जाती। यह अस्त-व्यस्त, धीमा, और बार-बार खराब होने वाला तरीका था।
फिर आया cron, एक daemon (यानि एक बैकग्राउंड प्रोसेस) जिसका जन्म शुरुआती Unix के दिनों में Bell Labs में हुआ था। इसका नाम Chronos के नाम पर रखा गया, जो समय के ग्रीक देवता हैं, और इससे ज़्यादा गीकी और क्या हो सकता है। Cron का काम आसान लेकिन क्रांतिकारी था: कमांड्स की एक लिस्ट और उनके चलने का समय पढ़ना, और फिर उन्हें एक्सेक्यूट करना। यह टास्क ऑटोमेशन के लिए एक "सेट करो और भूल जाओ" वाला सिस्टम था।
cron को यह बताने के लिए कि चीज़ें कब चलानी हैं, उसे एक भाषा की ज़रूरत थी। कोई लंबी-चौड़ी, अंग्रेज़ी जैसी भाषा नहीं, बल्कि कुछ ऐसा जिसे कंप्यूटर तुरंत पार्स कर सके। वही भाषा है cron expression। यह उस बुनियादी समस्या को हल करती है कि किसी भी रिकरिंग शेड्यूल को—"हर सोमवार सुबह 9 बजे," "हर महीने की पहली और 15वीं तारीख को," "हर 10 मिनट में"—एक स्टैंडर्ड, भरोसेमंद तरीके से कैसे बताया जाए। इसके बिना, हर डेवलपर scheduling का पहिया फिर से ईजाद कर रहा होता, और आपका सर्वर खुद के बनाए sleep() कमांड्स के जंजाल में फँसा होता।
अंदर की कहानी: यह कैसे काम करता है
एक cron expression अंजान लोगों के लिए खिचड़ी जैसी लग सकती है, कुछ इस तरह */15 9-17 * * 1-5। लेकिन यह कोई जादू नहीं है; यह एक बहुत ही स्ट्रक्चर्ड मिनी-लैंग्वेज है। एक बार जब आप इसका सिंटैक्स सीख जाते हैं, तो आप एक प्रो की तरह शेड्यूल पढ़ और लिख सकते हैं।
तबाही के पाँच फील्ड (और उनके दोस्त)
एक स्टैंडर्ड cron expression पाँच फील्ड्स से बना होता है, जिन्हें स्पेस से अलग किया जाता है। हर फील्ड समय की एक इकाई को दर्शाता है। इसे पाँच नॉब्स (knobs) के एक सेट की तरह सोचें जिन्हें आप सही समय सेट करने के लिए घुमाते हैं।
| फील्ड | अनुमत वैल्यू | अनुमत स्पेशल कैरेक्टर्स |
|---|---|---|
| मिनट | 0-59 | * , - / |
| घंटा | 0-23 | * , - / |
| महीने का दिन | 1-31 | * , - / ? L W |
| महीना | 1-12 या JAN-DEC | * , - / |
| हफ़्ते का दिन | 0-7 या SUN-SAT | * , - / ? L # |
कुछ मॉडर्न cron इम्प्लीमेंटेशन में साल (1970-2099) के लिए छठा फील्ड या सेकंड्स (0-59) के लिए एक शुरुआती फील्ड भी होता है, लेकिन क्लासिक पाँच-फील्ड वाला फॉर्मेट सबसे आम है।
हफ़्ते के दिन पर एक नोट: रविवार के लिए 0 और 7 दोनों अक्सर स्वीकार किए जाते हैं। किसी एक कन्वेंशन पर टिके रहना एक अच्छा विचार है (जैसे 0=रवि, 6=शनि)।
स्पेशल कैरेक्टर्स: गुप्त भाषा
cron expressions की असली ताकत कुछ स्पेशल कैरेक्टर्स से आती है जो नंबर्स को मॉडिफाई करते हैं।
*(यानि "हर"): यह वाइल्डकार्ड है।Hourफील्ड में एक तारांकन का मतलब है "दिन का हर घंटा"। हर फील्ड में एक तारांकन (* * * * *) का मतलब है "हर महीने के हर दिन के हर घंटे का हर मिनट..." आप समझ गए होंगे।,(यानि "और"): कॉमा एक लिस्ट सेपरेटर के रूप में काम करता है।Day of Monthफील्ड में1,15का मतलब है "महीने की पहली और 15वीं तारीख को।"-(यानि "से लेकर तक"): हाइफ़न एक रेंज को डिफाइन करता है।Hourफील्ड में9-17का मतलब है "सुबह 9 बजे से शाम 5 बजे तक हर घंटे।"/(यानि "स्टेप"): स्लैश का उपयोग इंक्रीमेंट निर्दिष्ट करने के लिए किया जाता है।Minuteफील्ड में*/10का मतलब है "हर 10 मिनट में।" आप इसे एक रेंज के साथ भी जोड़ सकते हैं:0-30/5का मतलब है "घंटे के पहले 30 मिनट के भीतर हर 5 मिनट में" (यानि :00, :05, :10, :15, :20, :25, :30 पर)।?(यानि "मुझे परवाह नहीं"): यह थोड़ा मुश्किल लेकिन महत्वपूर्ण है। आप हमेशा दोनोंDay of MonthऔरDay of Weekको स्पेसिफाई नहीं कर सकते क्योंकि वे आपस में टकरा सकते हैं। क्या होगा अगर आप कहें "महीने की 13 तारीख को और शुक्रवार को चलाओ," लेकिन 13 तारीख बुधवार को पड़ जाए??इस समस्या को यह कहकर हल करता है, "मैंने इनमें से एक फील्ड को स्पेसिफाई कर दिया है, इसलिए दूसरे को अनदेखा करो।" आप शेड्यूल को* * 13 * ?(13 तारीख को चलाओ, मुझे परवाह नहीं कि सप्ताह का कौन सा दिन है) या* * ? * 5(हर शुक्रवार को चलाओ, मुझे परवाह नहीं कि महीने की कौन सी तारीख है) पर सेट करेंगे।L(यानि "आखिरी"):Day of Monthफील्ड मेंLका मतलब है "महीने का आखिरी दिन" (यानि, 31 जनवरी, 28/29 फरवरी, आदि)।Day of Weekफील्ड में, इसका मतलब है "महीने का आखिरी X।" उदाहरण के लिए,5Lका मतलब है "महीने का आखिरी शुक्रवार।"W(यानि "वीकडे"):Day of Monthमें15Wका मतलब है "महीने की 15 तारीख के सबसे नज़दीकी वीकडे।" यदि 15 तारीख शनिवार है, तो जॉब शुक्रवार 14 तारीख को चलेगी। यदि 15 तारीख रविवार है, तो यह सोमवार 16 तारीख को चलेगी।#(यानि "n-वां"): यह "महीने का तीसरा शुक्रवार" जैसी चीजें खोजने के लिए है। उसके लिए एक्सप्रेशन होगा* * ? * 5#3।
सब कुछ एक साथ जोड़कर देखें
आइए कुछ आम एक्सप्रेशन्स को डिकोड करें:
# हर रात आधी रात को चलाएँ
0 0 * * *
- मिनट फील्ड में 0: मिनट शून्य पर (घंटे की शुरुआत में)।
- घंटे फील्ड में 0: घंटे शून्य पर (आधी रात)।
- अन्य फील्ड्स में
* * *: हर हफ़्ते के हर महीने के हर दिन।
# हर वीकडे (सोम-शुक्र) सुबह 8:30 बजे चलाएँ
30 8 * * 1-5
- मिनट फील्ड में 30: घंटे के 30 मिनट बाद।
- घंटे फील्ड में 8: सुबह 8 बजे।
- महीने के दिन और महीने के लिए
* *: कोई फ़र्क नहीं पड़ता। - हफ़्ते के दिन के लिए 1-5: सोमवार से शुक्रवार तक।
# वर्किंग आवर्स (सुबह 9 बजे - शाम 5 बजे) के दौरान हर 15 मिनट पर वीकडे में चलाएँ
*/15 9-17 * * 1-5
*/15: हर 15 मिनट में।9-17: घंटे 9, 10, 11, 12, 13, 14, 15, 16, और 17 के लिए।1-5: सोमवार से शुक्रवार तक।
असल दुनिया की कहानियाँ
आधी रात वाले बैकअप का किस्सा
एक स्टार्टअप का डेटाबेस तेजी से बढ़ रहा था। लीड sysadmin को पता था कि उन्हें रोज़ाना बैकअप की ज़रूरत है, लेकिन दिन में बैकअप स्क्रिप्ट चलाने से पूरा एप्लिकेशन धीमा हो जाता था। यूज़र्स शिकायत करते थे, और संभावित सेल्स का नुकसान हो रहा था। समाधान? एक साधारण cron job। उसने उस ज़्यादा रिसोर्स खाने वाली बैकअप स्क्रिप्ट को सुबह 2 बजे चलाने के लिए शेड्यूल किया, जब साइट पर ट्रैफिक लगभग शून्य था। एक्सप्रेशन 0 2 * * * कंपनी का गुमनाम हीरो बन गया, जिसने यह सुनिश्चित किया कि उनका डेटा एक भी यूज़र को परेशान किए बिना सुरक्षित रहे।
सबक: परफॉरमेंस बनाए रखने के लिए ज़्यादा रिसोर्स लेने वाले कामों को ऑफ-पीक घंटों के लिए शेड्यूल करें।
भूला हुआ न्यूज़लेटर
एक छोटी ई-कॉमर्स साइट सेल्स बढ़ाने के लिए हर मंगलवार सुबह एक "वीकली डील्स" ईमेल भेजना चाहती थी। महीनों तक, डेव नाम के एक मार्केटिंग व्यक्ति को सुबह 10 बजे मैन्युअल रूप से "Send" पर क्लिक करने का काम सौंपा गया था। लेकिन एक हफ़्ते, डेव बीमार पड़ गया। न्यूज़लेटर कभी नहीं गया, और उस मंगलवार की बिक्री बहुत खराब रही। लीड डेवलपर ने कदम बढ़ाया और प्रक्रिया को ऑटोमेट कर दिया। उसने न्यूज़लेटर भेजने के लिए एक स्क्रिप्ट लिखी और उसे एक cron job से जोड़ दिया: 0 10 * * 2। तब से, न्यूज़लेटर घड़ी की सुई की तरह समय पर जाने लगा, चाहे ऑफिस में कोई भी हो या न हो।
सबक: विश्वसनीयता में सुधार और मानवीय त्रुटि को खत्म करने के लिए दोहराए जाने वाले, समय-संवेदनशील कार्यों को ऑटोमेट करें।
बासी Cache का मामला
एक समाचार वेबसाइट ब्रेकिंग स्टोरीज़ पर गर्व करती थी, लेकिन उनका होमपेज अक्सर धीमा लगता था। परफॉरमेंस के लिए उनका कंटेंट कैश किया गया था, लेकिन कैश तभी क्लियर होता था जब कोई डेवलपर इसे मैन्युअल रूप से करता था। इसका मतलब था कि नए आर्टिकल्स को दिखने में कभी-कभी घंटों लग जाते थे। एक डेवलपर ने हर पाँच मिनट में साइट के कैश को स्वचालित रूप से क्लियर और रीबिल्ड करने के लिए एक cron job सेट किया। एक्सप्रेशन */5 * * * * के साथ, साइट नाटकीय रूप से तेज़ और ज़्यादा अप-टू-डेट हो गई, क्योंकि नए कंटेंट की कुछ ही मिनटों में दिखने की गारंटी थी।
सबक: सिस्टम को ताज़ा और परफॉरमेंट बनाए रखने के लिए कैश इनवैलिडेशन जैसे समय-समय पर होने वाले "हाउसकीपिंग" कार्यों के लिए cron का उपयोग करें।
आम गलतियाँ और जाल
टाइमज़ोन की समस्याएँ: एक क्लासिक "यह गलत समय पर चलता है" वाली समस्या। Cron jobs लगभग हमेशा सर्वर के सिस्टम टाइम का उपयोग करके चलते हैं, जो UTC या कोई और टाइमज़ोन हो सकता है जिसमें आप नहीं हैं। अपने समय के अनुसार सुबह
9बजे के लिए नौकरी शेड्यूल करने का मतलब हो सकता है कि यह सर्वर समय के अनुसार दोपहर 2 बजे चले। हमेशा अपने सर्वर के टाइमज़ोन के बारे में पता रखें।महीने का दिन vs. हफ़्ते के दिन का टकराव: एक नए डेवलपर वाली आम गलती
Day-of-MonthऔरDay-of-Weekदोनों फील्ड में एक वैल्यू डालना है (जैसे,* * 1 FRI)। ज़्यादातर cron daemon इसेORकंडीशन के साथ समझते हैं: "महीने की पहली तारीख को या किसी भी शुक्रवार को चलाओ।" यह शायद ही कभी होता है जो आप चाहते हैं। यदि आप "महीने का पहला शुक्रवार" चाहते हैं, तो आपको* * ? * 5#1या एक अधिक जटिल स्क्रिप्ट का उपयोग करने की आवश्यकता है। अस्पष्टता से बचने के लिए?कैरेक्टर का उपयोग करें।आउटपुट रीडायरेक्शन भूल जाना: डिफ़ॉल्ट रूप से, आपकी स्क्रिप्ट जो कुछ भी स्टैण्डर्ड आउटपुट या स्टैण्डर्ड एरर पर प्रिंट करती है, वह crontab के मालिक यूज़र को ईमेल कर दिया जाता है। यह मददगार लग सकता है, लेकिन यह जल्दी से किसी के मेलबॉक्स को फालतू के नोटिफिकेशन्स से भर सकता है। सबसे अच्छा तरीका यह है कि आउटपुट को स्पष्ट रूप से हैंडल करें: इसे एक लॉग फ़ाइल में भेजें (
>> /var/log/myjob.log 2>&1) या यदि आपको परवाह नहीं है तो इसे छोड़ दें (> /dev/null 2>&1)।ओवरलैपिंग जॉब: किसी जॉब को
* * * * *पर सेट करने का मतलब है "हर मिनट की शुरुआत में इस जॉब का एक नया इंस्टेंस शुरू करो।" यदि आपके जॉब को चलने में 90 सेकंड लगते हैं, तो आपके पास ओवरलैपिंग एक्सेक्यूशन होंगे, जिससे रेस कंडीशन, रिसोर्स की कमी, और हर तरह की गड़बड़ी हो सकती है।एकदम बेसिक माहौल: आपका इंटरैक्टिव शेल
$PATHजैसे सहायक एनवायरनमेंट वेरिएबल्स से भरा होता है। एक cron job बिल्कुल खाली, बिना किसी ताम-झाम वाले माहौल में चलता है। आपकी स्क्रिप्ट जो कमांड लाइन से पूरी तरह से चलती है, वह cron में विफल हो सकती है क्योंकि उसेnodeयाpythonजैसे प्रोग्राम नहीं मिल पाते हैं। इसका समाधान सभी कमांड के लिए एब्सोल्यूट पाथ का उपयोग करना है (जैसे,nodeके बजाय/usr/bin/node) या अपनी crontab फ़ाइल के शीर्ष परPATHवेरिएबल सेट करना है।
यह आपके रडार पर क्यों होना चाहिए
आप सोच सकते हैं कि cron सिर्फ पुराने ज़माने के सिस्टम एडमिनिस्ट्रेटर के लिए है, लेकिन इसका DNA हर जगह है।
- बैकएंड और DevOps: यह बैकग्राउंड जॉब्स को शेड्यूल करने के लिए एक तरह से स्टैंडर्ड बन चुका है, डेटाबेस मेंटेनेंस और लॉग रोटेशन से लेकर कोड डिप्लॉय करने तक।
- वेब डेवलपमेंट: रोज़ाना ईमेल रिपोर्ट भेजनी है, कैश साफ़ करना है, या साइटमैप बनाना है? Cron आपका टूल है।
- क्लाउड प्लेटफॉर्म्स: AWS Lambda शेड्यूल्ड इवेंट्स और Google Cloud Scheduler जैसी सेवाएँ अपने ट्रिगर्स को डिफाइन करने के लिए cron expressions का उपयोग करती हैं। यह सिंटैक्स शेड्यूलिंग के लिए एक यूनिवर्सल भाषा है, यहाँ तक कि सबसे मॉडर्न, "सर्वरलेस" वातावरण में भी।
Cron expressions को पढ़ना और लिखना सीखना एक बुनियादी स्किल है। यह ऑटोमेशन का ताला खोलने वाली चाबी है, जो आपको अधिक मजबूत, भरोसेमंद और आत्मनिर्भर सिस्टम बनाने की अनुमति देती है। यह उन छोटी-छोटी चीजों में से एक है, जिसे एक बार जब आप जान जाते हैं, तो आपको इसे हर जगह उपयोग करने के अवसर दिखाई देंगे।
और गहराई में जाएँ
- Wikipedia: cron - cron यूटिलिटी का इतिहास और ओवरव्यू।
- crontab(5) - Linux man page - फ़ाइल फॉर्मेट और उसके सिंटैक्स के लिए कैननिकल, तकनीकी रेफरेंस।
- Crontab Guru - cron expressions के लिए एक इंटरैक्टिव ऑनलाइन एडिटर जो उन्हें सरल अंग्रेजी में ट्रांसलेट करता है। अपना काम चेक करने के लिए यह बहुत उपयोगी है।
- The Open Group Base Specifications: crontab - POSIX स्टैण्डर्ड जो यह बताता है कि एक
crontabको क्या करना चाहिए। - Quartz CronTrigger Tutorial - एक लोकप्रिय Java-आधारित शेड्यूलर पर एक गहरी नज़र जो एक एक्सटेंडेड cron एक्सप्रेशन फॉर्मेट का उपयोग करता है, जिसमें सेकंड्स और अधिक स्पेशल कैरेक्टर्स शामिल हैं।