03 / गाइड
ऐसे cron एक्सप्रेशन लिखें जो सरप्राइज़ न दें
पाँच फ़ील्ड और उनकी रेंज, नाम बनाम संख्याएँ, day-of-month और day-of-week का OR जाल, रविवार 0 या 7 के रूप में, डेलाइट-सेविंग के अंतर और ओवरलैप, और डिप्लॉय से पहले अगले-रन प्रीव्यू से वैलिडेशन।
पाँच फ़ील्ड, बाएँ से दाएँ पढ़ें
क्लासिक cron एक्सप्रेशन स्पेस से अलग पाँच फ़ील्ड होते हैं: मिनट (0–59), घंटा (0–23), महीने का दिन (1–31), महीना (1–12), और हफ़्ते का दिन (0–7)। हर फ़ील्ड एकल वैल्यू, अल्पविराम से अलग सूची, हाइफ़न वाली रेंज, स्लैश के बाद स्टेप, या हर वैल्यू के लिए एस्टरिस्क स्वीकार करता है।
ज़्यादातर cron बग विदेशी सिंटैक्स नहीं, बल्कि लापरवाही से पढ़ा गया सामान्य फ़ील्ड होता है: कोई स्टेप जो रेंज सीमा पर रीसेट हो जाए, या बारह-घंटे की घड़ी के लिए लिखा घंटा फ़ील्ड ऐसे सिस्टम में जो तेईस तक गिनता है।
- सूचियाँसूचियाँ अलग-अलग वैल्यू चुनती हैं: मिनट फ़ील्ड में 0,30 घंटे के शीर्ष और आधे बजे चलाता है।
- रेंज और स्टेपरेंज एक विस्तार चुनती है: घंटा फ़ील्ड में 9-17 कार्यालयीन घंटे कवर करता है, और स्टेप उसे पतला करता है — 9-17/2 विस्तार के अंदर हर दूसरे घंटे चलाता है।
- एस्टरिस्क सबसे मेल खाता हैएस्टरिस्क “इस फ़ील्ड को अनदेखा करें” नहीं है; वह सक्रिय रूप से हर वैल्यू से मेल खाता है, जो दो दिन-फ़ील्ड एक साथ आते ही महत्वपूर्ण हो जाता है।
नाम बेहतर दस्तावेज़ीकरण वाली संख्याएँ हैं
महीना और वीकडे फ़ील्ड तीन-अक्षरीय अंग्रेज़ी नाम स्वीकार करते हैं — JAN से DEC और SUN से SAT — अपनी संख्याओं के उपनाम के रूप में। 0 9 * JAN MON और 0 9 * 1 1 एक ही शेड्यूल बताते हैं, पर नाम वाला रूप अगले पाठक को खुद समझाता है और ऑफ़-बाय-वन एडिट से बचता है।
- केस-असंवेदनशीलनाम केस-असंवेदनशील पार्स होते हैं — mon, Mon और MON तीनों चलते हैं — पर बड़े अक्षर वह परिपाटी है जो जानबूझकर लिखा दिखती है।
- रेंज में नामनाम रेंज और सूचियों के अंदर भी काम करते हैं: MON-FRI मानक कार्यदिवस विस्तार है, और JAN,APR,JUL,OCT त्रैमासिक महीने चुनता है।
- व्याख्या पढ़ेंCron बिल्डर और एक्सप्लेनर एक्सप्रेशन को नॉर्मलाइज़ करता है और हर फ़ील्ड अलग समझाता है — “month: every value”, “weekday: 1, 2, 3, 4, 5” — ताकि आप पुष्टि कर सकें कि पार्सर ने नाम वैसे ही पढ़े जैसे आपका मतलब था।
दो दिन वाले फ़ील्ड कैसे मिलते हैं
यह टूल Vixie-जैसे दिन नियम अपनाता है: जब दोनों दिन फ़ील्ड में से कोई * से शुरू नहीं होता, किसी एक का मेल पर्याप्त है। 0 9 13 * FRI का अर्थ हर महीने की 13 तारीख़ और हर शुक्रवार है, केवल शुक्रवार 13 नहीं।
एक्सप्लेनर का आउटपुट इस बारे में स्पष्ट है: वह कंप्यूट किए रन के साथ सिमेंटिक्स को dom-dow-or के रूप में रिपोर्ट करता है, ताकि इरादे से कहीं ज़्यादा बार चलने वाला एक्सप्रेशन crontab तक पहुँचने से पहले अपना पत्ता दिखा दे।
- * वाले स्टेप भी सीमा रखते हैंयदि दिन का कोई फ़ील्ड * से शुरू होता है, जैसे */2, तो इस टूल में दोनों दिन फ़ील्ड का मेल ज़रूरी है; स्टेप की सीमा बनी रहती है।
- शुरू में * नहीं तो ORजब कोई दिन फ़ील्ड * से शुरू नहीं होता, टूल OR लगाता है: महीने का दिन या हफ़्ते का दिन, किसी एक का मेल चल सकता है।
- AND को वर्कअराउंड चाहिएअसली शुक्रवार-13 को पकड़ने के लिए cron से 13 तारीख चुनवाएँ और कमांड से ही वीकडे जाँच कराएँ — या AND सिमेंटिक्स वाला शेड्यूलर इस्तेमाल करें, जो क्लासिक cron नहीं है।
रविवार 0 है, और आमतौर पर 7 भी
वीकडे फ़ील्ड रविवार को 0, सोमवार को 1, और इसी तरह शनिवार को 6 गिनता है। ज़्यादातर कार्यान्वयन सोमवार से गिनने वालों के लिए 7 को दूसरे रविवार के रूप में भी स्वीकार करते हैं — Toolars पार्सर 7 को अंदरूनी तौर पर 0 में नॉर्मलाइज़ करता है — पर कुछ सिस्टम दोनों में से सिर्फ़ एक स्वीकार करते हैं, और सोमवार को 1 से शुरू करने वाली ISO-शैली की गिनती कहीं और मौजूद है।
- 0 और 7जहाँ 7 स्वीकार होता है वहाँ 0 और 7 दोनों रविवार हैं; शेड्यूलरों में पोर्टेबल चुनाव 0 लिखना है।
- चुपचाप ऑफ़-बाय-वनजिस सिस्टम में 7 अस्वीकार हो वहाँ वीकडे 7 डिप्लॉय समय पर ज़ोर से विफल होता है, पर “सोमवार से गिनकर सातवाँ दिन” समझा गया वीकडे गलत दिन पर चुपचाप विफल होता है।
- हर प्लेटफ़ॉर्म पर फिर पुष्टि करेंजब एक्सप्रेशन कार्यान्वयनों के बीच चले — सिस्टम crontab, कंटेनर प्लेटफ़ॉर्म, CI शेड्यूलर — तो वीकडे गिनती की फिर पुष्टि करें, यह मानने के बजाय कि वह सफर बचकर पूरी हुई।
डेलाइट सेविंग शेड्यूल मोड़ देती है
डेलाइट-सेविंग बदलाव स्थानीय समय के कुछ मिनट हटाते या दोहराते हैं। प्रीव्यू वसंत में न मौजूद 02:30 छोड़ता है और पतझड़ में दोहराया मेल खाने वाला मिनट दो बार दिखाता है। असली शेड्यूलर छूटा रन बाद में चला सकता है या दोहराव रोक सकता है; उसकी नीति जाँचें।
- गायब घंटावसंत के समय-अंतर में प्रीव्यू को 02:30 का कोई मेल नहीं मिलता; कुछ शेड्यूलर छूटी नौकरी बदलाव के बाद चलाते हैं।
- दोगुना घंटापतझड़ के दोहराव में प्रीव्यू दोनों समय दिखा सकता है, जबकि असली शेड्यूलर दूसरा रन रोक सकता है।
- UTC में DST नहींसाफ़ निकास UTC है: उसमें डेलाइट-सेविंग बदलाव नहीं होते, इसलिए 30 2 * * * साल के हर दिन एक ही क्षण का मतलब रखता है। एक्सप्लेनर UTC, डिवाइस का लोकल ज़ोन और America/New_York व Europe/London जैसे नामित ज़ोन देता है।
आशा से नहीं, अगले रन से वैलिडेट करें
सही एक्सप्रेशन और कredible दिखने वाले एक्सप्रेशन में फ़र्क ठोस चलने के समयों की सूची है। Cron बिल्डर और एक्सप्लेनर आपके चुने टाइम ज़ोन में अभी से अगले दस रन कंप्यूट करता है, 366 दिन आगे तक खोजता है, और बैकग्राउंड वर्कर में मूल्यांकन करता है ताकि भारी एक्सप्रेशन टैब न रोक सके।
- रन पढ़ेंपहले कुछ रन इरादे के सामने पढ़ें: “कार्यदिवसों पर 09:00” को सोमवार से शुक्रवार नौ बजे दिखाना चाहिए, और सूची में शनिवार OR जाल का ऐलान है।
- बदलाव पार करेंनाम वाला समय क्षेत्र चुनें और अगला डेलाइट-सेविंग बदलाव 366-दिन के प्रीव्यू में हो तो आने वाले रन देखें। गणना अभी से शुरू होती है; मनचाही आरंभ तिथि नहीं चुनी जा सकती।
- स्पष्ट त्रुटियाँअवैध एक्सप्रेशन त्रुटि देते हैं। 366 दिनों में कोई मेल न मिले तो खोज-सीमा त्रुटि आती है; एक से नौ मेल हों तो आंशिक परिणाम मिलता है।
शेड्यूल और पैटर्न एक ही अनुशासन बाँटते हैं।
दोनों छोटी स्ट्रिंग हैं जिनका विस्फोट दायरा बहुत बड़ा है — रेगुलर एक्सप्रेशन के लिए लिखें-टेस्ट करें-रिफ़ैक्टर करें का चक्र सीखें, टाइमआउट के साथ लोकल वर्कर में चलता हुआ।