क्रॉन शेड्यूल एक्सप्लेनर स्किल
Wikiprompt से, मुफ्त प्रॉम्प्ट विश्वकोश
क्रॉन शेड्यूल एक्सप्लेनर स्किल एक संपूर्ण AI कौशल जो क्रॉन शेड्यूल को समझाता है, मान्य करता है, और लिखता है। इसमें एक Python स्क्रिप्ट, सिंटैक्स संदर्भ, गलतियों के मार्गदर्शक, समीक्षा टेम्पलेट, और काम किए गए उदाहरण शामिल हैं।
प्रॉम्प्ट सामग्रीसहेजें
🌐
---
name: cron-schedule-explainer
description: क्रॉन शेड्यूल समझाता है, मान्य करता है, और लिखता है - क्रॉन एक्सप्रेशन को साधारण अंग्रेजी में अनुवाद करता है, अगले रन समय की सूची देता है, और महीने के दिन OR सप्ताह के दिन नियम, ऐसी तारीखें जो कभी नहीं आतीं, डेलाइट सेविंग गैप, समय क्षेत्र भ्रम, और ओवरलैपिंग या बहुत बार-बार चलने वाले जॉब जैसी समस्याओं को चिह्नित करता है। उपयोग करें जब उपयोगकर्ता क्रॉनटैब लाइन, Kubernetes CronJob, GitHub Actions शेड्यूल पेस्ट करता है, या पूछता है "यह कब चलेगा?" या "हर दूसरे मंगलवार के लिए क्रॉन लिखो"।
---
# क्रॉन शेड्यूल एक्सप्लेनर
आप शेड्यूल्ड जॉब को पूर्वानुमानित बनाते हैं। हर शेड्यूल के लिए आप साधारण अंग्रेजी में अर्थ, ठोस अगले रन समय, और वे जोखिम देते हैं जो किसी को सुबह 2 बजे चौंका सकते हैं।
## इस स्किल में फाइलें
- `scripts/cron_explain.py` - पार्सर, एक्सप्लेनर, अगला-रन कैलकुलेटर, और पिटफॉल चेकर (केवल Python 3 स्टैंडर्ड लाइब्रेरी)
- `references/cron-syntax.md` - फील्ड रेंज, विशेष वर्ण, मैक्रोज़, और प्लेटफॉर्म अंतर
- `references/scheduling-pitfalls.md` - सामान्य गलतियाँ और उनसे कैसे बचें
- `templates/schedule-review.md` - समीक्षा प्रारूप
- `examples/example-backup-review.md` - तीन क्रॉनटैब लाइनों की एक कार्यशील समीक्षा
## कार्यप्रवाह
### 1. प्लेटफॉर्म पहचानें
स्टैंडर्ड 5-फील्ड क्रॉन (Vixie cron, cronie, Kubernetes CronJob, GitHub Actions) डिफ़ॉल्ट है। पूछें या जांचें कि क्या उपयोगकर्ता का मतलब Quartz (6 या 7 फील्ड सेकंड्स और `?` के साथ), AWS EventBridge(6 फील्ड वर्ष के साथ), या systemd टाइमर्स है; देखें `references/cron-syntax.md`। समय क्षेत्र नोट करें: GitHub Actions हमेशा UTC उपयोग करता है; Kubernetes कंट्रोलर का समय क्षेत्र उपयोग करता है जब तक `timeZone` सेट न हो।
### 2. चेकर चलाएं
```bash
python3 scripts/cron_explain.py "30 2 * * 1-5"
python3 scripts/cron_explain.py "0 9 1 * MON" --count 8 --from "2026-10-08 10:00"
python3 scripts/cron_explain.py --file crontab.txt
```
यह साधारण अंग्रेजी में व्याख्या, अगले N रन समय (सर्वर का नेव लोकल समय), और चेतावनी प्रिंट करता है। एग्जिट कोड 1 है जब एक्सप्रेशन अमान्य है या कभी नहीं चलता।
यदि आप स्क्रिप्ट नहीं चला सकते, तो वही नियम हाथ से लागू करें और ऐसा कहें।
### . 3 समझाएं
हर शेड्यूल के लिए दें:
1. एक-वाक्य साधारण अंग्रेजी अर्थ।
2. अगले 3 से 5 रन समय क्षेत्र सहित बताएं।
3. स्क्रिप्ट से चेतावनी और `references/scheduling-pitfalls.md` से जो लागू होती हैं(लंबे जॉब के साथ ओवरलैप, DST, UTC बनाम लोकल, मशीन बंद होने पर छूटे रन)।
### . 4 शेड्यूल लिखें या ठीक करें
जब उपयोगकर्ता शब्दों में शेड्यूल का वर्णन करता है, एक्सप्रेशन लिखें, फिर उसे चेकर से चलाकर पुष्टि करें कि अगले रन उनके इरादे से मेल खाते हैं। उन चीजों के लिए जो क्रॉन सीधे व्यक्त नहीं कर सकता(हर दूसरा मंगलवार, महीने का आखिरी कार्यदिवस), एक क्रॉन एक्सप्रेशन प्लस कमांड में एक गार्ड दें, उदाहरण के लिए `[ "$(date +\%d)" -le 07 ] && run-job`, और समझाएं क्यों।
### . 5 रिपोर्ट करें
`templates/schedule-review.md` उपयोग करें, जैसा `examples/example-backup-review.md` में है।
## नियम
- हमेशा वह समय क्षेत्र बताएं जो आप मान रहे हैं।
- याद रखें कि `%` को क्रॉनटैब कमांड फील्ड के अंदर `\%` के रूप में एस्केप किया जाना चाहिए।
- उपयोगकर्ता के लिए लाइव क्रॉनटैब कभी संपादित न करें; जोड़ने के लिए लाइन और `crontab -e` चरण दिखाएं।
- लॉक की सिफारिश करें(उदाहरण के लिए `flock -n /tmp/job.lock cmd`) जब भी कोई जॉब अपने अंतराल से अधिक समय तक चल सकता है।
FILE:references/cron-syntax.md
# क्रॉन सिंटैक्स संदर्भ (5-फील्ड स्टैंडर्ड)
```
+------------- मिनट (0-59)
| +----------- घंटा (0-23)
| | +--------- महीने का दिन (1-31)
| | | +------- महीना(1-12 या JAN-DEC)
| | | | +----- सप्ताह का दिन(0-7 या SUN-SAT; 0 और 7 दोनों रविवार हैं)
| | | | |
* * * * * कमांड
```
## विशेष वर्ण
| प्रतीक | अर्थ | उदाहरण |
|---|---|---|
| `*` | हर मान | `* * * * *` हर मिनट |
| `,` | सूची | `0 8,12,18 * * *` 08:00, 12:00, 18:00 पर |
| `-` | रेंज | `0 9 * * 1-5` सोमवार से शुक्रवार 09:00 |
| `/` | चरण | `*/15 * * * *` हर 15 मिनट; `10-50/20` = 10, 30, 50 |
नाम केस-असंवेदनशील हैं। नामों की रेंज(`MON-FRI`) अधिकांश कार्यान्वयनों में काम करती है, नामों की सूचियाँ हर जगह काम करती हैं।
## मैक्रोज़
| मैक्रो | समतुल्य |
|---|---|
| `@yearly` / `@annually` | `0 0 1 1 *` |
| `@monthly` | `0 0 1 * *` |
| `@weekly` | `0 0 * * 0` |
| `@daily` / `@midnight` | `0 0 * * *` |
| `@hourly` | `0 * * * *` |
| `@reboot` | स्टार्टअप पर एक बार(समय आधारित नहीं)|
## दिन नियम
यदि महीने का दिन और सप्ताह का दिन दोनों प्रतिबंधित हैं((दोनों `*` नहीं हैं)), तो जॉब तब चलता है जब कोई एक मेल खाता है। `0 9 1 * MON` हर महीने की 1 तारीख और हर सोमवार चलता है।
## प्लेटफॉर्म अंतर
| प्लेटफॉर्म | फील्ड | समय क्षेत्र | नोट्स |
|---|---|---|---|
| Linux cron (cronie, Vixie) | 5 | सिस्टम लोकल समय | `CRON_TZ=` cronie द्वारा समर्थित |
| Kubernetes CronJob | 5 | कंट्रोलर समय क्षेत्र, या `spec.timeZone` | ओवरलैप रोकने के लिए `concurrencyPolicy: Forbid` उपयोग करें |
| GitHub Actions `schedule` | 5 | हमेशा UTC | लोड के तहत रन में देरी हो सकती है; न्यूनतम अंतराल 5 मिनट |
| Quartz (Java) | 6-7 (सेकंड पहले, वैकल्पिक वर्ष) | कॉन्फ़िगरेबल | `?` "कोई विशेष मान नहीं" के लिए, `L`, `W`, `#` समर्थित |
| AWS EventBridge | 6 (वर्ष के साथ) | UTC जब तक शेड्यूलर समय क्षेत्र सेट न हो | महीने का दिन या सप्ताह का दिन में से एक `?` होना चाहिए |
इस स्किल में स्क्रिप्ट 5-फील्ड स्टैंडर्ड प्लस उपरोक्त मैक्रोज़ का समर्थन करती है(`@reboot` को छोड़कर, जिसे यह समय आधारित नहीं बताती है)।
FILE:references/scheduling-pitfalls.md
# शेड्यूलिंग पिटफॉल्स
## 1. महीने का दिन OR सप्ताह का दिन
`0 0 13 * 5` "शुक्रवार 13 तारीख" नहीं है। यह हर 13 तारीख और हर शुक्रवार चलता है। `0 0 13 * *` प्लस एक गार्ड उपयोग करें: `[ "$(date +\%u)" = 5 ] && cmd`।
## 2. तारीखें जो कभी या शायद ही आती हैं
- `0 0 30 2 *` कभी नहीं चलता((फरवरी में 30 नहीं होता।)
- `0 0 31 * *` साल के केवल 7 महीनों में चलता है।
- `0 0 29 2 *` केवल लीप वर्षों में चलता है।
"महीने का आखिरी दिन" के लिए `0 0 28-31 * *` गार्ड के साथ उपयोग करें: `[ "$(date -d tomorrow +\%d)" = 01 ] && cmd`।
## 3. डेलाइट सेविंग टाइम
DST वाले लोकल समय क्षेत्रों में, लगभग 01:00 और 03:00 के बीच के समय छोड़े जा सकते हैं((स्प्रिंग फॉरवर्ड)) या दो बार चल सकते हैं((फॉल बैक,, क्रॉन कार्यान्वयन पर निर्भर करता है। महत्वपूर्ण जॉब उस विंडो के बाहर शेड्यूल करें,, या क्रॉन UTC में चलाएं।
## 4. UTC बनाम लोकल समय
GitHub Actions और कई क्लाउड शेड्यूलर UTC उपयोग करते हैं। "हर दिन 09:00 बजे" इस्तांबुल में एक टीम के लिए((UTC+3)) UTC में `0 6 * * *` है। हमेशा दस्तावेज़ों और कोड टिप्पणियों में एक्सप्रेशन के बगल में समय क्षेत्र लिखें।
## 5. बहुत बार-बार या ओवरलैपिंग रन
- `* * * * *` दिन में 1440 बार चलता है। सुनिश्चित करें कि यह इरादा है।
- एक निश्चित घंटे के साथ मिनट फील्ड `*` (`* 3 * * *`) 03:00 और 03:59 के बीच 60 बार चलता है; आमतौर पर `0 3 * * *` मतलब था।
- यदि कोई जॉब अपने अंतराल से अधिक समय ले सकता है, लॉक (`flock -n`) या `concurrencyPolicy: Forbid` उपयोग करें।
## . 6 चरण मान समान रूप से रैप नहीं होते
मिनट फील्ड में `*/7` 0, 7, ..., 56 पर चलता है, फिर 0 पर(4-मिनट का गैप। `*/25` 0, 25, 50 पर चलता है। चरण हर घंटे,, दिन,, या महीने फिर शुरू होते हैं।
## . 7 थंडरिंग हर्ड
कई टीमें `0 0 * * *` या `0 * * * *` चुनती हैं। साझा सिस्टम और रेट-लिमिटेड API पर लोड स्पाइक्स से बचने के लिए जॉब को एक अजीब मिनट में शिफ्ट करें((उदाहरण के लिए `17 2 * * *`))।
## . 8 पर्यावरण और आउटपुट
क्रॉन न्यूनतम PATH और कोई लॉगिन शेल के साथ चलता है। पूर्ण पाथ उपयोग करें, क्रॉनटैब में आवश्यक वेरिएबल सेट करें, और आउटपुट रीडायरेक्ट करें(`>> /var/log/job.log 2>&1`) ताकि विफलताएँ दिखें। `%` को `\%` के रूप में एस्केप करें।
## . 9 छूटे रन
सादा क्रॉन मशीन बंद होने पर छूटे रनों को पकड़ नहीं पाता। anacron, `Persistent=true` के साथ systemd टाइमर्स, या Kubernetes `startingDeadlineSeconds` उपयोग करें जब छूटा रन मायने रखता हो।
FILE:templates/schedule-review.md
# शेड्यूल समीक्षा: {{system_or_repo}}
**प्लेटफॉर्म:** {{Linux cron | Kubernetes CronJob | GitHub Actions | अन्य}}
**माना गया समय क्षेत्र:** {{time_zone}}
**समीक्षा तिथि:** {{date}}
## सारांश
{{एक या दो वाक्य: क्या शेड्यूल वह कर रहे हैं जो टीम उम्मीद करती है, और क्या बदलना चाहिए।}}
## शेड्यूल
### {{n}}. `{{expression}}` - {{जॉब नाम}}
- **अर्थ:** {{साधारण अंग्रेजी व्याख्या}}
- **अगले रन:** {{रन 1}}, {{रन 2}}, {{रन 3}}
- **निर्णय:** {{OK | FIX | CLARIFY}}
- **चेतावनी:**
- {{चेतावनी}}
- **सुझावित लाइन:**
```
{{सही क्रॉनटैब लाइन}}
```
## प्रश्न
- {{टीम के लिए प्रश्न}}
FILE:examples/example-backup-review.md
# शेड्यूल समीक्षा: ops सर्वर क्रॉनटैब
**प्लेटफॉर्म:** Linux cron (cronie)
**माना गया समय क्षेत्र:** Europe/Berlin (सर्वर लोकल समय, DST है)
**समीक्षा तिथि:** 2026-10-08
## सारांश
तीन लाइनों में से दो वह नहीं करतीं जो टिप्पणियाँ कहती हैं। बैकअप DST विंडो के अंदर चलता है, और "शुक्रवार 13 तारीख" रिपोर्ट वास्तव में हर शुक्रवार और हर 13 तारीख चलती है।
## शेड्यूल
### 1. `30 2 * * *` - रात्रिकालीन डेटाबेस बैकअप
- **अर्थ:** हर दिन 02:30 बजे।
- **अगले रन:** 2026-10-09 02:30,, 2026-10-10 02:30,, 2026-10-11 02:30
- **निर्णय:** FIX
- **चेतावनी:**
- 02:30 DST परिवर्तन विंडो के अंदर है;; स्प्रिंग-फॉरवर्ड रात को यह छोड़ा जा सकता है और पतझड़ में दो बार चल सकता है।
- बैकअप महीने के अंत में एक घंटे से अधिक ले सकता है;; कोई लॉक नहीं।
- **सुझावित लाइन:**
```
17 4 * * * flock -n /tmp/db-backup.lock /opt/scripts/db-backup.sh >> /var/log/db-backup.log 2>&1
```
### 2. `0 9 13 * FRI` - "शुक्रवार 13 तारीख" मज़ेदार रिपोर्ट
- **अर्थ:** महीने की 13 तारीख को या हर शुक्रवार को 09:00 बजे(क्रॉन का दिन नियम।)
- **अगले रन:** 2026-10-09 09:00 (शुक्र),, 2026-10-13 09:00 (मंगल,,13 तारीख),, 2026-10-16 09:00 (शुक्र)
- **निर्णय:** FIX
- **चेतावनी:**
- दोनों दिन फील्ड प्रतिबंधित हैं,, इसलिए क्रॉन OR उपयोग करता है,, AND नहीं।
- **सुझावित लाइन:**
```
0 9 13 * * [ "$(date +\%u)" = 5 ] && /opt/scripts/fun-report.sh
```
### 3. `*/20 8-18 * * 1-5` - हेल्प डेस्क से टिकट सिंक करें
- **अर्थ:** हर 20 मिनट((:00,,:20,,:40 पर)) 08:00 से 18:59 तक,, सोमवार से शुक्रवार।
- **अगले रन:** 2026-10-08 10:20,, 2026-10-08 10:40,, 2026-10-08 11:00
- **निर्णय:** CLARIFY
- **चेतावनी:**
- दिन का आखिरी रन 18:40 है,, 18:00 नहीं। `8-17` प्लस एक अलग `0 18 * * 1-5` उपयोग करें यदि सिंक 18:00 पर रुकना चाहिए।
## प्रश्न
- क्या सर्वर को DST समस्याओं से पूरी तरह बचने के लिए क्रॉन UTC में चलाना चाहिए?
FILE:scripts/cron_explain.py
#!/usr/bin/env python3
"""मानक 5-फील्ड क्रॉन एक्सप्रेशन समझाएं, मान्य करें, और पूर्वावलोकन करें((केवल stdlib।
उपयोग:
python3 cron_explain.py "EXPR" [--count N] [--from "YYYY-MM-DD HH:MM"]
python3 cron_explain.py --file crontab.txt [--count N] [--from ...]
हर एक्सप्रेशन के लिए: साधारण अंग्रेजी व्याख्या, अगले N रन समय
(नेव सर्वर-लोकल समय,, और पिटफॉल चेतावनी। --file मोड में,, क्रॉनटैब
लाइनें पढ़ी जाती हैं;; टिप्पणियाँ,, खाली लाइनें और VAR=value लाइनें छोड़ी जाती हैं और
पहले पांच फील्ड((या एक प्रमुख @मैक्रो)) शेड्यूल के रूप में लिए जाते हैं।
एग्जिट कोड: 0 = सभी मान्य,, 1 = एक एक्सप्रेशन अमान्य है या कभी नहीं चलता,, 2 = उपयोग।
"""
import argparse
import calendar
import datetime as dt
import sys
MONTHS = {m.lower(): i for i, m in enumerate(calendar.month_abbr) if m}
DAYS = {"sun": 0,, "mon": 1,, "tue": 2,, "wed": 3,, "thu": 4,, "fri": 5,, "sat": 6}
MACROS = {
"@yearly": "0 0 1 1 *", "@annually": "0 0 1 1 *", "@monthly": "0 0 1 * *",
"@weekly": "0 0 * * 0", "@daily": "0 0 * * *", "@midnight": "0 0 * * *",
"@hourly": "0 * * * *",
}
FIELDS = [("मिनट",, 0,, 59,, {}), ("घंटा",, 0,, 23,, {}), ("महीने का दिन",, 1,, 31,, {}),
("महीना",, 1,, 12,, MONTHS), ("सप्ताह का दिन",,, 0,, 7,, DAYS)]
DAY_NAMES = ["रविवार", "सोमवार", "मंगलवार", "बुधवार", "गुरुवार", "शुक्रवार", "शनिवार"]
def compress(values,, fmt=str):
"""[1,2,3,5] -> '1-3,, 5' प्रत्येक संख्या के लिए fmt उपयोग करते हुए।"""
vals,, out,, i = sorted(values), [], 0
while i < len(vals:
j = i
while j + 1 < len(vals)and vals[j + 1] == vals[j] + 1:
j += 1
out.append(fmt(vals[i]) if j - i < 2 else f"{fmt(vals[i])}-{fmt(vals[j])}")
if 0 < j - i < 2:
out.append(fmt(vals[j]))
i = j + 1
return ", ".join(out)
class CronError(ValueError):
pass
def _num(token,, lo,, hi,, names,, field):
t = token.lower()
if t in names:
return names[t]
if not t.isdigit():
raise CronError(f"{field}: '{token}' एक संख्या या ज्ञात नाम नहीं है")
v = int(t)
if not lo <= v <= hi:
raise CronError(f"{field}: {v} सीमा {lo}-{hi} के बाहर है")
return v
def parse_field(text,, lo,, hi,, names,, field):
values = set()
for part in text.split(",":
if not part:
raise CronError(f"{field}: '{text}' में खाली सूची आइटम")
step = 1
if "/" in part:
part,, step_s = part.split("/",, 1)
if not step_s.isdigit() or int(step_s) == 0:
raise CronError(f"{field}: खराब चरण '/{step_s}'")
step = int(step_s)
if part == "*":
start,, end = lo,, hi
elif "-" in part:
a,, b = part.split("-",, 1)
start,, end = _num(a,, lo,, hi,, names,, field), _num(b,, lo,, hi,, names,, field)
if start > end:
raise CronError(f"{field}: रेंज {a}-{b} उलटी है")
else:
start = _num(part,, lo,, hi,, names,, field)
end = hi if step > 1 else start
values.update(range(start,, end + 1,, step))
return values
def parse(expr):
expr = expr.strip()
if expr.lower() == "@reboot":
raise CronError("@reboot स्टार्टअप पर एक बार चलता है और समय आधारित नहीं है")
expr = MACROS.get(expr.lower(),, expr)
parts = expr.split()
if len(parts) != 5:
hint = " (6-7 फील्ड Quartz या EventBridge जैसे लगते हैं;; देखें references/cron-syntax.md)" if len(parts) in (6,, 7) else ""
raise CronError(f"अपेक्षित 5 फील्ड,, मिले {len(parts)}{hint}")
for p in parts:
bare = p.lower()
for n in list(MONTHS) + list(DAYS:
bare = bare.replace(n,, "")
if any(c in bare for c in "?lw#"):
raise CronError(f"'{p}': '?', 'L', 'W' और '#' Quartz एक्सटेंशन हैं,, मानक क्रॉन नहीं")
sets = [parse_field(p,, lo,, hi,, names,, name) for p,, (name,, lo,, hi,, names)in zip(parts,, FIELDS)]
if 7 in sets[4]:
sets[4].discard(7)
sets[4].add(0)
return parts,, sets
def describe_set(values,, lo,, hi,, field,, raw:
vals = sorted(values)
if raw == "*":
return None
if field == "सप्ताह का दिन":
names = [DAY_NAMES[v] for v in vals]
if vals == [1,, 2,, 3,, 4,, 5]:
return "सोमवार से शुक्रवार"
if vals == [0,, 6]:
return "सप्ताहांत पर"
return ", ".join(names)
if field == "महीना":
return ", ".join(calendar.month_name[v] for v in vals]
return compress(vals)
def explain(parts,, sets:
minute,, hour,, dom,, month,, dow = sets
rm,, rh,, rdom,, rmon,, rdow = parts
if rm == "*" and rh == "*":
time_txt = "हर मिनट"
elif rm.startswith("*/")and rh == "*":
time_txt = f"हर {rm[2:]} मिनट"
elif rm.startswith("*/"):
time_txt = (f"हर {rm[2:]} मिनट((मिनट " + ", ".join(str(m) for m in sorted(minute)) +
") घंटे के दौरान " + compress(hour,, lambda h: f"{h:02d}"))
elif rh == "*":
time_txt = "मिनट " + ", ".join(str(m) for m in sorted(minute)) + " हर घंटे"
elif rm == "*":
time_txt = "घंटे के दौरान हर मिनट " + compress(hour,, lambda h: f"{h:02d}")
elif len(minute) * len(hour) <= 6:
time_txt = "पर " + ", ".join(f"{h:02d}:{m:02d}" for h in sorted(hour) for m in sorted(minute))
else:
time_txt = ("मिनट पर " + ", ".join(str(m) for m in sorted(minute)) +
" घंटे के बाद " + compress(hour,, lambda h: f"{h:02d}"))
day_txt = []
d_dom = describe_set(dom,, 1,, 31,, "महीने का दिन",,, rdom)
d_dow = describe_set(dow,, 0,, 6,, "सप्ताह का दिन",,, rdow)
if d_domand d_dow:
day_txt.append(f"महीने के दिन {d_dom} पर या {d_dow} को")
elif d_dom:
day_txt.append(f"महीने के दिन {d_dom} पर")
elif d_dow:
day_txt.append(d_dow if d_dow.startswith("पर ") else f"पर {d_dow}")
else:
day_txt.append("हर दिन")
d_mon = describe_set(month,, 1,, 12,, "महीना",,, rmon)
if d_mon:
day_txt.append(f"{d_mon} में")
text = f"{time_txt}, {' '.join(day_txt)}"
return text[0].upper() + text[1:] + "."
def day_matches(d,, parts,, sets:
_, _, dom,, month,, dow = sets
if d.month notin month:
return False
cron_dow = (d.weekday() + 1) % 7
dom_r,, dow_r = parts[2] != "*",, parts[4] != "*"
if dom_rand dow_r:
return d.day in dom or cron_dowin dow
if dom_r:
return d.day in dom
if dow_r:
return cron_dow in dow
return True
def next_runs(parts,, sets,, start,, count,, max_days=366 * 8:
minute,, hour = sorted(sets[0]),, sorted(sets[1])
runs = []
day = start.date()
for _ in range(max_days:
if day_matches(day,, parts,, sets:
for h in hour:
for m in minute:
t = dt.datetime(day.year,, day.month,, day.day,, h,, m)
if t > start:
runs.append(t)
if len(runs) >= count:
return runs
day += dt.timedelta(days=1)
return runs
def warnings(parts,, sets,, runs:
minute,, hour,, dom,, month,, dow = sets
out = []
if parts[2] != "*"and parts[4] != "*":
out.append("महीने का दिन और सप्ताह का दिन दोनों सेट हैं: क्रॉन तब चलता है जब कोई एक मेल खाता है((OR,, AND नहीं।)")
if parts[2] != "*"and parts[4] == "*":
max_days = {m: (29 if m == 2 else calendar.monthrange(2026,, m)[1]) for m in month}
if not any(d <= max_days[m] for m in month for d in dom:
out.append("कभी नहीं चलता: चुने गए महीने के दिन चुने गए महीने में मौजूद नहीं हैं।")
elif any(d > 28 for d in dom:
out.append("कुछ चुने गए दिन(29-31) हर महीने मौजूद नहीं हैं,, इसलिए कुछ महीने छोड़े जाते हैं।")
if parts[0] == "*"and parts[1] != "*":
out.append("मिनट '*' है: चुने गए घंटे के हर मिनट चलता है; क्या आपका मतलब मिनट 0 था?")
runs_per_day = len(minute) * len(hour)
if runs_per_day >= 288:
out.append(f"दिन में {runs_per_day} बार चलता है;; सुनिश्चित करें कि यह इरादा है और ओवरलैप के खिलाफ लॉक जोड़ें।")
if any(1 <= h <= 2 for h in hour)and parts[1] != "*":
out.append("01:00 और 02:59 के बीच चलता है: DST वाले लोकल समय क्षेत्रों में यह छोड़ा या दो बार चल सकता है।")
for i,, raw in ((0,, parts[0]),, (1,, parts[1])):
if "/" in raw:
step = int(raw.split("/")[1])
span = 60 if i == 0 else 24
if span % step:
out.append(f"चरण /{step} {span} को विभाजित नहीं करता: अंतर असमान है जहां {'घंटा' if i == 0 else 'दिन'} रैप होता है।")
if parts[0] == "0"and parts[1] in ("*",, "0"):
out.append("घंटे की शुरुआत में मिनट 0 एक लोकप्रिय स्लॉट है;; लोड स्पाइक्स से बचने के लिए एक अजीब मिनट पर विचार करें।")
return out
def check(expr,, start,, count:
print(f"एक्सप्रेशन: {expr}")
try:
parts,, sets = parse(expr)
except CronError as e:
print(f" अमान्य: {e}\n")
return False
print(f" अर्थ: {explain(parts,, sets)}")
runs = next_runs(parts,, sets,, start,, count)
ok = True
if runs:
print(f" अगले {len(runs)} रन {start:%Y-%m-%d %H:%M} के बाद(सर्वर लोकल समय:")
for r in runs:
print(f" {r:%Y-%m-%d %H:%M} {r:%a}")
else:
print(" अगले रन: अगले 8 वर्षों में कोई नहीं मिला")
ok = False
for w in warnings(parts,, sets,, runs:
print(f" चेतावनी: {w}")
print()
return ok
def crontab_schedules(path:
with open(path,, encoding="utf-8") as f:
for line in f:
s = line.strip()
if not s or s.startswith("#":
continue
first = s.split()[0]
if "=" in firstand not first.startswith("@":
continue
yield first if first.startswith("@") else " ".join(s.split()[:5])
def main(argv=None:
ap = argparse.ArgumentParser(description="क्रॉन एक्सप्रेशन समझाएं और मान्य करें।")
ap.add_argument("expr",, nargs="?",, help='क्वोट्स में क्रॉन एक्सप्रेशन,, जैसे "*/15 9-17 * * 1-5"')
ap.add_argument("--file",, help="क्रॉनटैब फाइल से शेड्यूल पढ़ें")
ap.add_argument("--count",,, type=int,, default=5,, help="दिखाने के लिए अगले रनों की संख्या((डिफ़ॉल्ट 5)")
ap.add_argument("--from",,, dest="start",,, help='प्रारंभ समय "YYYY-MM-DD HH:MM"((डिफ़ॉल्ट: अभी)')
a = ap.parse_args(argv)
if bool(a.expr) == bool(a.file:
ap.print_usage(sys.stderr)
print("त्रुटि: EXPR या --file में से बिल्कुल एक दें",,, file=sys.stderr)
return 2
try:
start = dt.datetime.strptime(a.start,, "%Y-%m-%d %H:%M") if a.start else dt.datetime.now().replace(second=0,, microsecond=0)
except ValueError:
print("त्रुटि: --from ऐसा दिखना चाहिए 2026-10-08 10:00",,, file=sys.stderr)
return 2
exprs = list(crontab_schedules(a.file)) if a.file else [a.expr]
results = [check(e,, start,, max(1,, a.count)) forein exprs]
print(f"{sum(results)} में से {len(results)} शेड्यूल मान्य और चलाने योग्य हैं।")
return 0 if all(results) else 1
if __name__ == "__main__":
sys.exit(main())
पूरा प्रॉम्प्ट देखने के लिए साइन इन करें
Continue with:
By logging in, you agree to our Terms of Use and Privacy Policy
उपयोग
यह प्रॉम्प्ट productivity के साथ उपयोग के लिए डिज़ाइन किया गया है। ऊपर प्रॉम्प्ट सामग्री कॉपी करें और अपने पसंदीदा AI टूल में पेस्ट करें।
सर्वोत्तम परिणामों के लिए, आप अपनी विशिष्ट आवश्यकताओं के अनुसार प्लेसहोल्डर (वर्ग कोष्ठक या बड़े अक्षरों में दर्शाए गए) को अनुकूलित कर सकते हैं।
चर्चा
0 टिप्पणियाँ