cron अभिव्यक्तियाँ कैसे बनाएँ

· 9 मिनट पढ़ने का समय

क्रॉन एक्सप्रेशन लिनक्स, क्लाउड प्लेटफ़ॉर्म, CI/CD पाइपलाइन और टास्क शेड्यूलर में दोहराए जाने वाले शेड्यूल परिभाषित करने का मानक तरीका है। सिंटैक्स संक्षिप्त है पर सहज नहीं, एक विज़ुअल क्रॉन जनरेटर बनाने से आपको ठीक-ठीक पता चलता है कि आपका जॉब कब चलेगा, डिप्लॉयमेंट से पहले सामान्य त्रुटियाँ पकड़ी जाती हैं, और ऑटोमेशन के सबसे त्रुटि-प्रवण भाग से अनुमान हट जाते हैं। एक बार जब आप पाँच फ़ील्ड, विशेष वर्ण और सबसे सामान्य नुकसान समझ लेते हैं, तो आप किसी भी दोहराव शेड्यूल को आत्मविश्वास के साथ निर्दिष्ट कर सकते हैं।

क्रॉन का संक्षिप्त इतिहास

पहला क्रॉन ब्रायन कर्निघन से Unix संस्करण 7 में आया, लगभग 1979 में। यह हर मिनट अपनी कॉन्फ़िगरेशन फिर से पढ़ता और जो भी देय था उसे चलाता। पॉल विक्सी ने 1987 में इसे फिर से लिखा जिसे अब विक्सी क्रॉन कहा जाता है, और यही वह संस्करण है जिसे अधिकांश लिनक्स वितरण आज भी भेजते हैं। विक्सी क्रॉन ने प्रति-उपयोगकर्ता क्रॉनटैब, परिवेश चर, @reboot कीवर्ड, और कई सुविधाजनक विशेषताएँ जोड़ीं जिन्होंने इस प्रारूप को गैर-व्यवस्थापकों के लिए भी उपयोग योग्य बना दिया।

5-फ़ील्ड सिंटैक्स चालीस से अधिक वर्षों में मुश्किल से बदला है। Amazon EventBridge, Google Cloud Scheduler, Kubernetes CronJob, GitHub Actions, GitLab CI, Jenkins, Airflow, n8n और दर्जनों अन्य प्रणालियाँ सभी एक ही संक्षिप्त प्रारूप का उपयोग करती हैं, बस मामूली एक्सटेंशन के साथ। यही स्थिरता है जिसके कारण क्रॉन को एक बार सीखकर फिर कभी न सीखना पड़े यह उपयुक्त है। यह कौशल हर उस जगह स्थानांतरित होता है जहाँ घड़ी पर ऑटोमेशन चलता है।

क्रॉन सिंटैक्स

मानक क्रॉन एक्सप्रेशन में 5 फ़ील्ड होते हैं, जो स्पेस द्वारा अलग होते हैं। प्रत्येक फ़ील्ड समय का एक स्लाइस नियंत्रित करता है, और जब हर फ़ील्ड वर्तमान क्षण से मेल खाता है तो एक जॉब चलता है।

┌───────────── मिनट (0-59)
│ ┌───────────── घंटा (0-23)
│ │ ┌───────────── महीने का दिन (1-31)
│ │ │ ┌───────────── महीना (1-12, या JAN-DEC)
│ │ │ │ ┌───────────── सप्ताह का दिन (0-6, रवि=0, या SUN-SAT)
│ │ │ │ │
* * * * *

घंटे, मिनट और महीने के लिए फ़ील्ड AND द्वारा जुड़ते हैं, लेकिन विक्सी क्रॉन में महीने-का-दिन और सप्ताह-का-दिन OR द्वारा जुड़ते हैं। इसका अर्थ है कि 0 12 1 * 1 हर महीने की 1 तारीख को AND हर सोमवार दोपहर को फ़ायर करता है, न केवल उन सोमवारों को जो 1 तारीख को पड़ते हैं। यह जाल लगभग हर किसी को पहली बार पकड़ता है।

सामान्य क्रॉन शेड्यूल

वे पैटर्न जिनका आप सबसे अधिक उपयोग करेंगे:

शेड्यूलएक्सप्रेशनअर्थ
हर मिनट* * * * *हर 60 सेकंड में चलता है
हर 5 मिनट*/5 * * * *:00, :05, :10, :15 पर...
हर 15 मिनट*/15 * * * *:00, :15, :30, :45 पर
हर घंटे0 * * * *हर घंटे के शीर्ष पर
हर 2 घंटे0 */2 * * *00:00, 02:00, 04:00 पर...
रोज़ आधी रात0 0 * * *दिन में एक बार 00:00 पर
रोज़ सुबह 9 बजे0 9 * * *दिन में एक बार 09:00 पर
दिन में दो बार0 9,21 * * *09:00 और 21:00 पर
हर सोमवार 8 बजे0 8 * * 1साप्ताहिक, सोमवार को
कार्यदिवस शाम 6 बजे0 18 * * 1-5सोमवार से शुक्रवार
हर माह की 1 तारीख0 0 1 * *मासिक, 1 तारीख की आधी रात
हर तिमाही0 0 1 */3 *1 जन, 1 अप्रैल, 1 जुल, 1 अक्ट
हर कार्यदिवस सुबह0 7 * * 1-507:00 सोम-शुक्र
रविवार दोपहर0 12 * * 0साप्ताहिक, रविवार को

कई सिस्टम संक्षिप्त उपनाम भी स्वीकार करते हैं जो समकक्ष 5-फ़ील्ड एक्सप्रेशन में विस्तारित होते हैं: @yearly, @monthly, @weekly, @daily, @hourly और @reboot। ये संक्षिप्त हैं लेकिन सार्वभौमिक नहीं, इसलिए उन पर भरोसा करने से पहले अपने प्लेटफ़ॉर्म की जाँच करें।

क्रॉन एक्सप्रेशन कैसे बनाएं

  1. ग्रैन्युलैरिटी चुनें: क्या आपको हर मिनट, हर घंटे, दिन में एक बार, सप्ताह में एक बार, या महीने में एक बार चाहिए? अपनी आवश्यकता को पूरा करने वाली सबसे मोटी सेटिंग से शुरू करें।
  2. विज़ुअल नियंत्रणों का उपयोग करें: ड्रॉपडाउन से मिनट, घंटा, दिन, महीना और सप्ताह के दिन के मान चुनें। या "हर घंटे" या "रोज़ आधी रात" जैसे प्रीसेट से शुरू करें और समायोजित करें।
  3. अगले रन समयों का पूर्वावलोकन करें: जनरेटर अगले 5 निष्पादन समय दिखाता है, जिससे आप पुष्टि कर सकते हैं कि शेड्यूल आपकी अपेक्षा के अनुसार फ़ायर होता है।
  4. समय क्षेत्र की जाँच करें: पूर्वावलोकन उस सर्वर या शेड्यूलर के समय क्षेत्र से मेल खाना चाहिए जो जॉब चलाएगा, आपके स्थानीय समय से नहीं।
  5. एक्सप्रेशन कॉपी करें और इसे अपनी क्रॉनटैब, GitHub Actions YAML, AWS EventBridge नियम, या जो भी शेड्यूलर आप उपयोग करते हैं उसमें पेस्ट करें।
  6. पहले छोटे अंतराल के साथ परीक्षण करें अंतिम शेड्यूल को कमिट करने से पहले। एक त्वरित */5 * * * * साबित करता है कि जॉब फ़ायर होता है; जब आप दो या तीन रन देख लें, तो वास्तविक एक्सप्रेशन में बदल दें।

विशेष वर्ण और ऑपरेटर

क्रॉन किसी भी फ़ील्ड के अंदर ऑपरेटरों के एक छोटे लेकिन शक्तिशाली सेट का समर्थन करता है।

वर्णअर्थउदाहरण
*कोई भी मान* * * * * = हर मिनट
*/nहर n वाँ*/15 * * * * = हर 15 मिनट
,कई असतत मान0 8,12,18 * * * = 8, दोपहर, 18
-समावेशी श्रेणी0 9-17 * * * = 9 से 17 तक हर घंटे
n-m/kस्टेप के साथ श्रेणी0 9-17/2 * * * = 9, 11, 13, 15, 17
?कोई विशिष्ट मान नहीं (केवल Quartz)0 0 ? * MON (Java शेड्यूलर)
Lअंतिम (AWS, Quartz)DoM में L = महीने का अंतिम दिन
Wनिकटतम कार्यदिवस (AWS, Quartz)15W = 15 के निकटतम कार्यदिवस
#एनवाँ सप्ताह-दिन (AWS, Quartz)MON#2 = महीने का दूसरा सोमवार
@hourlyशॉर्टहैंड0 * * * * के समान

वेनिला विक्सी क्रॉन केवल पहली पाँच पंक्तियों का समर्थन करता है। उन्नत ऑपरेटर (L, W, #, ?) Quartz से आते हैं, Java शेड्यूलिंग लाइब्रेरी, और AWS EventBridge और कुछ अन्य क्लाउड शेड्यूलर ने उन्हें अपनाया है। वे पोर्टेबल नहीं हैं, इसलिए उन्हें ऐसे कोड के साथ न मिलाएं जो किसी सामान्य लिनक्स बॉक्स पर चलना है।

विभिन्न प्लेटफ़ॉर्म पर क्रॉन

क्रॉन संबंधित सिंटैक्स का एक परिवार है, एक एकल मानक नहीं। यह जानना कि आपका शेड्यूलर कौन सी बोली बोलता है, घंटों डीबगिंग बचाता है।

प्लेटफ़ॉर्मफ़ील्डनोट्स
विक्सी क्रॉन (लिनक्स)5क्लासिक। */n, श्रेणियाँ, सूचियाँ, कोई उन्नत ऑपरेटर नहीं
BSD क्रॉन5विक्सी जैसा लेकिन परिवेश में थोड़े अंतर
crontab.guru5वेब-आधारित पार्सर जो विक्सी सिमेंटिक्स को दर्शाता है
GitHub Actions5विक्सी सिंटैक्स, UTC में चलता है, न्यूनतम 5 मिनट का रेज़ोल्यूशन
GitLab CI5विक्सी सिंटैक्स, इंस्टेंस समय क्षेत्र में चलता है
AWS EventBridge6वर्ष जोड़ता है। सप्ताह दिन 1-7 (रवि=1) का उपयोग करता है, L/W/# का समर्थन करता है
Google Cloud Scheduler5विक्सी सिंटैक्स प्लस समय क्षेत्र कॉन्फ़िगरेशन
Kubernetes CronJob5विक्सी सिंटैक्स @ शॉर्टकट के साथ
Quartz (Java)6 या 7शुरू में सेकंड और वैकल्पिक वर्ष जोड़ता है
systemd टाइमरOnCalendar प्रारूपक्रॉन नहीं, पर स्पष्ट सिंटैक्स के साथ वही समस्या हल करता है

यदि आप ऐसा शेड्यूल लिखते हैं जिसे एक से अधिक प्लेटफ़ॉर्म पर चलना है, तो रूढ़िवादी 5-फ़ील्ड उपसमुच्चय पर टिके रहें जिसे हर सिस्टम समझता है। L, W, या # तभी उपयोग करें जब आप जानते हों कि गंतव्य उनका समर्थन करता है।

सामान्य नुकसान

क्रॉन के विकल्प

कुछ वर्कलोड के लिए क्रॉन का मोटा मिनट रेज़ोल्यूशन और हिसाब-किताब की कमी चुभने लगती है। सबसे आम अपग्रेड:

उपकरणताकतकब चुनें
systemd टाइमरस्पष्ट OnCalendar सिंटैक्स, रिबूट के पार स्थायी, units के साथ एकीकृतआप पहले से systemd चलाते हैं और समृद्ध लॉगिंग चाहते हैं
Anacronस्लीप के बाद छूटे रन पकड़ता हैलैपटॉप या ऐसी मशीनें जो हमेशा चालू नहीं रहतीं
Airflow / DagsterDAG निर्भरताएं, पुनः प्रयास, अवलोकनीयताबहु-चरण डेटा पाइपलाइन
Temporalस्टेटफुल वर्कफ़्लो, बिल्कुल एक बार गारंटीसेवाओं के पार लंबे चलने वाले ऑर्केस्ट्रेशन
AWS EventBridgeप्रबंधित, Lambda, S3, SQS के साथ एकीकृतAWS पर कोई भी क्लाउड-नेटिव चीज़
GitHub Actionsसार्वजनिक रेपो के लिए मुफ़्त, होस्टेड रनर पर चलता हैCI-निकट निर्धारित जॉब
क्रॉन ट्रिगर पर सर्वरलेस फ़ंक्शनकोई सर्वर रखरखाव नहींहल्के कार्य जो Lambda में फिट होते हैं

क्रॉन एक बार वाले दोहराव जॉब के अधिकांश के लिए सही उत्तर बना रहता है। अन्य उपकरण तब चमकते हैं जब आपको स्थिति, पुनः प्रयास, निर्भरताएं, या मशीनों के पार समन्वय चाहिए।

गोपनीयता और क्रॉन जनरेटर

क्रॉन एक्सप्रेशन जनरेटर पूरी तरह से आपके ब्राउज़र में चलता है। आप जो शेड्यूल बनाते हैं, अगले रन समयों का पूर्वावलोकन, और कॉपी किया गया एक्सप्रेशन कभी भी हमारे सर्वरों को नहीं छूते। इसका कोई लॉग नहीं है कि कौन से एक्सप्रेशन उत्पन्न हुए, कौन से प्रीसेट लोकप्रिय हैं इस पर कोई टेलीमेट्री नहीं, और किसी के लिए भी पुनर्निर्माण करने का कोई तरीका नहीं कि आप किस शेड्यूल पर काम कर रहे थे। क्रॉन एक्सप्रेशन ऊपरी तौर पर व्यक्तिगत डेटा नहीं हैं, लेकिन एक जॉब का शेड्यूल (एक रात्रिकालीन डेटाबेस निर्यात, एक साप्ताहिक बिलिंग रन, एक भागीदार के साथ प्रति घंटा सिंक) किसी व्यवसाय के संचालन के बारे में बहुत कुछ बता सकता है। उस जानकारी को क्लाइंट-साइड रखना तीसरे पक्ष को बुनियादी ढाँचे के पैटर्न लीक करने से बचाता है। शेड्यूल चुनने जैसे नियमित कार्य के लिए, डिफ़ॉल्ट गोपनीयता उन शेड्यूल के प्रतिनिधित्व करने वाली चीज़ों की संवेदनशीलता से मेल खानी चाहिए।

अक्सर पूछे जाने वाले प्रश्न

cron अभिव्यक्ति का फ़ॉर्मेट क्या है?

एक मानक cron अभिव्यक्ति में रिक्त स्थान से अलग 5 फ़ील्ड होते हैं, जो मिनट (0-59), घंटा (0-23), महीने का दिन (1-31), महीना (1-12) और सप्ताह का दिन (0-6, जहाँ 0 रविवार है) दर्शाते हैं। एक तारक (*) का अर्थ है इस फ़ील्ड के लिए «प्रत्येक» मान।

cron में */5 का क्या मतलब है?

*/5 सिंटैक्स का अर्थ है «प्रत्येक 5»। मिनट फ़ील्ड में, */5 का अर्थ है प्रत्येक 5 मिनट (0, 5, 10, 15...)। घंटा फ़ील्ड में, */5 का अर्थ है प्रत्येक 5 घंटे। यह किसी भी फ़ील्ड में काम करता है।

क्या cron अभिव्यक्तियाँ सभी प्लेटफ़ॉर्मों पर समान हैं?

5-फ़ील्ड फ़ॉर्मेट Linux cron, AWS EventBridge, GitHub Actions और अधिकांश शेड्यूलिंग सिस्टम पर मानक है। कुछ प्लेटफ़ॉर्म सेकंड या वर्ष के लिए 6वाँ फ़ील्ड जोड़ते हैं। अपने प्लेटफ़ॉर्म के दस्तावेज़ीकरण से परामर्श करें।

प्रत्येक महीने के अंतिम दिन के लिए शेड्यूल कैसे करें?

मानक cron में «अंतिम दिन» कीवर्ड नहीं है। अपनी स्क्रिप्ट में तिथि जाँच के साथ दैनिक निष्पादन जैसे समाधान का उपयोग करें, या प्लेटफ़ॉर्म-विशिष्ट एक्सटेंशन का उपयोग करें (AWS EventBridge «last» के लिए L का समर्थन करता है)।

Why did my cron job not run at the expected time?

The most common cause is timezone confusion. Server cron usually runs in UTC, not your local time. Other causes include the server being asleep at the scheduled minute, the user crontab not being installed, or PATH/environment differences between your shell and cron's stripped-down environment.

What is the difference between 0 in the day-of-week field and 7?

Both 0 and 7 represent Sunday in classic Vixie cron, which uses 0-6 plus an alias for 7. Some implementations (notably AWS EventBridge) use 1-7 with Sunday as 7 and Monday as 1, so always check your platform's documentation before assuming.