cron अभिव्यक्तियाँ कैसे बनाएँ
क्रॉन एक्सप्रेशन लिनक्स, क्लाउड प्लेटफ़ॉर्म, 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-5 | 07:00 सोम-शुक्र |
| रविवार दोपहर | 0 12 * * 0 | साप्ताहिक, रविवार को |
कई सिस्टम संक्षिप्त उपनाम भी स्वीकार करते हैं जो समकक्ष 5-फ़ील्ड एक्सप्रेशन में विस्तारित होते हैं: @yearly, @monthly, @weekly, @daily, @hourly और @reboot। ये संक्षिप्त हैं लेकिन सार्वभौमिक नहीं, इसलिए उन पर भरोसा करने से पहले अपने प्लेटफ़ॉर्म की जाँच करें।
क्रॉन एक्सप्रेशन कैसे बनाएं
- ग्रैन्युलैरिटी चुनें: क्या आपको हर मिनट, हर घंटे, दिन में एक बार, सप्ताह में एक बार, या महीने में एक बार चाहिए? अपनी आवश्यकता को पूरा करने वाली सबसे मोटी सेटिंग से शुरू करें।
- विज़ुअल नियंत्रणों का उपयोग करें: ड्रॉपडाउन से मिनट, घंटा, दिन, महीना और सप्ताह के दिन के मान चुनें। या "हर घंटे" या "रोज़ आधी रात" जैसे प्रीसेट से शुरू करें और समायोजित करें।
- अगले रन समयों का पूर्वावलोकन करें: जनरेटर अगले 5 निष्पादन समय दिखाता है, जिससे आप पुष्टि कर सकते हैं कि शेड्यूल आपकी अपेक्षा के अनुसार फ़ायर होता है।
- समय क्षेत्र की जाँच करें: पूर्वावलोकन उस सर्वर या शेड्यूलर के समय क्षेत्र से मेल खाना चाहिए जो जॉब चलाएगा, आपके स्थानीय समय से नहीं।
- एक्सप्रेशन कॉपी करें और इसे अपनी क्रॉनटैब, GitHub Actions YAML, AWS EventBridge नियम, या जो भी शेड्यूलर आप उपयोग करते हैं उसमें पेस्ट करें।
- पहले छोटे अंतराल के साथ परीक्षण करें अंतिम शेड्यूल को कमिट करने से पहले। एक त्वरित
*/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.guru | 5 | वेब-आधारित पार्सर जो विक्सी सिमेंटिक्स को दर्शाता है |
| GitHub Actions | 5 | विक्सी सिंटैक्स, UTC में चलता है, न्यूनतम 5 मिनट का रेज़ोल्यूशन |
| GitLab CI | 5 | विक्सी सिंटैक्स, इंस्टेंस समय क्षेत्र में चलता है |
| AWS EventBridge | 6 | वर्ष जोड़ता है। सप्ताह दिन 1-7 (रवि=1) का उपयोग करता है, L/W/# का समर्थन करता है |
| Google Cloud Scheduler | 5 | विक्सी सिंटैक्स प्लस समय क्षेत्र कॉन्फ़िगरेशन |
| Kubernetes CronJob | 5 | विक्सी सिंटैक्स @ शॉर्टकट के साथ |
| Quartz (Java) | 6 या 7 | शुरू में सेकंड और वैकल्पिक वर्ष जोड़ता है |
| systemd टाइमर | OnCalendar प्रारूप | क्रॉन नहीं, पर स्पष्ट सिंटैक्स के साथ वही समस्या हल करता है |
यदि आप ऐसा शेड्यूल लिखते हैं जिसे एक से अधिक प्लेटफ़ॉर्म पर चलना है, तो रूढ़िवादी 5-फ़ील्ड उपसमुच्चय पर टिके रहें जिसे हर सिस्टम समझता है। L, W, या # तभी उपयोग करें जब आप जानते हों कि गंतव्य उनका समर्थन करता है।
सामान्य नुकसान
- महीने-का-दिन और सप्ताह-का-दिन OR से जुड़े हैं,
0 9 15 * 1जैसा एक्सप्रेशन हर सोमवार AND हर महीने की 15 तारीख को फ़ायर करता है, न केवल 15 को जब वह सोमवार हो। प्रतिच्छेद करने के लिए, आपको आमतौर पर एक बाहरी रैपर या अलग शेड्यूलर चाहिए। - समय क्षेत्र की भ्रांति, सर्वर क्रॉनटैब लगभग हमेशा UTC में चलते हैं। यदि आप 9 बजे पूर्वी समय चाहते हैं, तो वह सर्दियों में
0 14 * * *UTC है पर गर्मियों में डेलाइट सेविंग के कारण0 13 * * *UTC। ऐसा शेड्यूलर उपयोग करें जो समय-क्षेत्र संकेतों का समर्थन करता हो, या सब कुछ UTC में सामान्यीकृत करें। - डेलाइट सेविंग संक्रमण, स्थानीय समय 02:30 पर निर्धारित जॉब घड़ियाँ पीछे करने पर दो बार चल सकते हैं और आगे करने पर बिल्कुल नहीं। संवेदनशील जॉब 01:00-03:00 विंडो के बाहर निर्धारित करें या UTC उपयोग करें।
- विक्सी की
MAILTOट्रैप, यदि आपका जॉब stdout पर कुछ भी प्रिंट करता है, तो विक्सी क्रॉन आउटपुट को क्रॉनटैब के स्वामी उपयोगकर्ता को मेल कर देता है। मेल रिले के बिना सर्वरों पर यह जल्दी से/var/spool/mailभर देता है।>>/var/log/myjob.log 2>&1के साथ आउटपुट को लॉग फ़ाइल में रीडायरेक्ट करें। - परिवेश आपका लॉगिन शेल नहीं है, क्रॉन छीने गए परिवेश के साथ चलता है: आपकी
.bashrcसे कोईPATHनहीं, कोई virtualenv नहीं, कोईnvmनहीं। क्रॉनटैब के शीर्ष पर आवश्यक चर सेट करें या अपनी स्क्रिप्ट को निरपेक्ष पथ के साथ कॉल करें। - प्रतिशत चिह्नों को एस्केप करने की आवश्यकता, विक्सी क्रॉनटैब में बिना एस्केप किया
%कमांड में नई-पंक्ति वर्ण के रूप में व्याख्या किया जाता है। यदि आपके कमांड को शाब्दिक प्रतिशत चिह्न चाहिए, तो हमेशा इसे\%के रूप में एस्केप करें, उदाहरण के लिएdate +"%Y-%m-%d"कॉल में। - लंबे चलने वाले जॉब ओवरलैप करते हैं, क्रॉन कोई रन नहीं छोड़ता क्योंकि पिछला अभी भी चल रहा है। यदि आपका जॉब अंतराल से अधिक ले सकता है, तो इसे लॉक फ़ाइल (
flock,setlock) में लपेटें या एक जॉब रनर का उपयोग करें जो समवर्तीता को संभालता है। - 59 मिनट पर ओवरफ़्लो,
*/40 * * * *हर 40 मिनट में फ़ायर नहीं होता। यह हर घंटे के मिनट 0 और मिनट 40 पर फ़ायर होता है क्योंकि स्टेप मान फ़ील्ड की सीमाओं के चारों ओर लपेटते हैं। वास्तविक 40-मिनट अंतराल के लिए आपको अधिक समृद्ध शेड्यूलर चाहिए। - मिनट फ़ील्ड में
0भूलना,* 9 * * *09:00 से 09:59 तक हर मिनट चलता है, 09:00 पर एक बार नहीं। मिनट फ़ील्ड को एक स्पष्ट मान चाहिए यदि आप प्रति घंटे एक ही फ़ायरिंग चाहते हैं। - क्रॉन लैपटॉप पर अविश्वसनीय है, anacron इसी कारण मौजूद है। विक्सी क्रॉन स्लीप के बाद छूटे रन पकड़ता नहीं, इसलिए 03:00 पर निर्धारित दैनिक बैकअप उस समय लैपटॉप बंद होने पर नहीं चलेगा। anacron,
Persistent=trueके साथ systemd टाइमर, या macOS पर एक launchd plist का उपयोग करें।
क्रॉन के विकल्प
कुछ वर्कलोड के लिए क्रॉन का मोटा मिनट रेज़ोल्यूशन और हिसाब-किताब की कमी चुभने लगती है। सबसे आम अपग्रेड:
| उपकरण | ताकत | कब चुनें |
|---|---|---|
| systemd टाइमर | स्पष्ट OnCalendar सिंटैक्स, रिबूट के पार स्थायी, units के साथ एकीकृत | आप पहले से systemd चलाते हैं और समृद्ध लॉगिंग चाहते हैं |
| Anacron | स्लीप के बाद छूटे रन पकड़ता है | लैपटॉप या ऐसी मशीनें जो हमेशा चालू नहीं रहतीं |
| Airflow / Dagster | DAG निर्भरताएं, पुनः प्रयास, अवलोकनीयता | बहु-चरण डेटा पाइपलाइन |
| 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.