באג ההפקה הגרוע ביותר שגרמתי אי פעם היה דמות אחת בהבעת מקורבים רציתי שגיבוי מסד נתונים יפעל כל לילה בחצות כתבתי 0 0 * * * בראש שלי, מוקלדת 0 0 * * 0 לתוך הקרונטאב, והמשיך הלאה העבודה רצה פעם אחת - ביום ראשון שלאחר מכן - ואז לא שוב במשך שבוע גיליתי מתי אני צריך גיבוי שלא היה קיים הספרה היחידה שלא במקומה הפכה " כל יום" לתוך " כל יום ראשון," ושום דבר בתחביר לא הזהיר אותי קרון עושה בדיוק מה שאתה אומר לו, בשקט, לנצח.
TL;DR: ה מחולל ביטויי קרון בונה ביטוי crontab סטנדרטי בן חמישה שדות משדות רגילים או הגדרות קבועות מראש בלחיצה אחת, מסביר זאת במשפט תוך כדי הקלדה, ומציג תצוגה מקדימה של זמני הריצה הבאים ב-UTC כדי שתוכל לאשר את לוח הזמנים לפני שהוא מגיע לייצור. זה פועל כולו בדפדפן שלך - אין חשבון, אין העלאה.
בניתי את הכלי הזה עבור Toolz.dev כי מעולם לא רציתי שוב להתחייב לוח זמנים בדקתי רק בראש שלי קריאת ביטוי cron בחזרה כאנגלית פשוטה ולראות את התאריכים בפועל זה יהיה אש תופס את 0 -לעומת- * מחלקה של טעות באופן מיידי מדריך זה מכסה כיצד תחביר cron עובד, האינטראקציות כי להכשיל כמעט את כולם, וכיצד להשתמש במחולל כדי לייצר ביטוי שאתה יכול לסמוך עליו.
מהו ביטוי cron?
ביטוי cron הוא לוח זמנים קומפקטי העשוי מחמישה שדות המופרדים ברווחים משמאל לימין הם דקה, שעה, יום בחודש, חודש ויום בשבוע. צורת חמשת השדות מוגדרת על ידי POSIX ב- פורמט כניסה ל-crontab. מתזמן - ה-Unix הקלאסי cron daemon, אבל גם מערכות CI, Kubernetes CronJobs, ואינספור רצי משימות - קורא את הביטוי ומפטר את העבודה שלך בכל רגע שתואם את כל התחומים.
כל שדה מקבל יותר ממספר בודד כוכב (*) פירושו "every" ערך השדה הזה. רשימה כמו 1,15,30 פירושו מספר ערכים ספציפיים. a range like 1-5 פירושו טווח כולל. צעד כמו */15 פירושו "כל חמש עשרה" ערך החל מהשדה's מינימום. אתה משלב את אלה על פני חמשת השדות כדי לתאר כמעט כל לוח זמנים שחוזר על עצמו: כל דקה, כל רבע שעה, ימי חול בשעה 8 בבוקר, הראשון בכל חודש, הרבעון האחרון 's יום הפתיחה. הכוח הוא אמיתי, וכך גם הצפיפות - חמישה שדות יכולים לקודד לוח זמנים מדויק באופן מפתיע, וזו בדיוק הסיבה שקל לטעות בהם בעדינות.
הנה פריסת השדה שבה משתמש המחולל, עם הטווח התקף עבור כל אחד מהם:
| עמדה | שדה | טווח | הערות |
|---|---|---|---|
| 1 | דקה | 0–59 | |
| 2 | שעה | 0–23 | שעון 24 שעות |
| 3 | יום בחודש | 1–31 | |
| 4 | חודש | 1–12 | JAN-DEC גם קיבל |
| 5 | יום בשבוע | 0–6 | 0 ו-7 שניהם פירושם יום ראשון; SUN-SAT מקובל |
למה לייצר את הביטוי במקום לכתוב אותו ביד
כתיבת cron ביד היא הימור שזכרת את סדר השדה, הטווחים והאינטראקציות בצורה נכונה, ללא משוב עד שהעבודה פועלת או לא מצליחה. המחולל מחליף את ההימור הזה באישור. כשאתה ממלא את השדות הוא עושה שלושה דברים בבת אחת.
ראשית, הוא מרכיב ומאמת את הביטוי, תופס ערכים מחוץ לטווח, טווחים הפוכים ושלבים שגויים עם הודעה ששמה את השדה הפוגע. ביטוי כמו 0 25 * * * - שעה 25 לא קיימת - נדחית בהסבר ולא מתקבלת ובשקט לעולם לא רצה.
שנית, זה מציג את לוח הזמנים כמשפט. 0 8 * * 1-5 הופך ל-" בשעה 08:00 בימים שני עד שישי." קריאת לוח הזמנים במילים היא הדרך המהירה ביותר לשים לב שמה שבנית זה לא מה שהתכוונת. באג הגיבוי שלי בחצות היה ברור ברגע שקראתי את " בשעה 00:00 ביום ראשון" במקום " בשעה 00:00."
שלישית, הוא מציג תצוגה מקדימה של זמני הריצה הקרובים בפועל. לראות שעבודה תידלק בפעם הבאה בעוד שלושה חודשים במקום הלילה אומר לך שמשהו לא בסדר הרבה יותר קרביים מאשר לבהות בכוכביות. התצוגה המקדימה הזו תופסת גם לוחות זמנים בלתי אפשריים - בקש את ה-30 בפברואר והמחולל לא מציג ריצות קרובות כלל, כי אין כאלה.
כיצד להשתמש במחולל הביטוי של Cron
שלב 1: התחל מלוח מוגדר מראש או ריק
המסלול המהיר ביותר לביטוי נכון הוא להתחיל מאחד שכבר קרוב. בחר הגדרה מראש כמו "Weekdays ב-8 בבוקר," "כל 15 דקות," או "ראשון לחודש בחצות," והשדות נטענים מוכנים להתאמה. אם אף אחד לא מתאים, התחל מברירת המחדל של כל דקה וערוך למטה. הגדרות קבועות מראש קיימות מכיוון שרוב לוחות הזמנים האמיתיים הם וריאציות על תריסר דפוסים נפוצים, והחל מביטוי ידוע-טוב מבטל קטגוריה שלמה של טעויות.
שלב 2: הגדר את חמשת השדות
הזן ערך בכל שדה, או השאר אותו כ * עבור "every." כל שדה מקבל ערך בודד, רשימת פסיקים, טווח מקף או שלב קו נטוי. לדוגמה, כדי לרוץ בראש כל שעה במהלך שעות העבודה בימי חול, הגדר דקה ל 0, שעה עד 9-17, ויום בשבוע עד 1-5, משאיר את היום בחודש והחודש כמו *. הרמז מתחת לכל שדה מזכיר לך את הטווח התקף שלו כך שאינך צריך לשנן את הסדר.
שלב 3: קרא את התיאור באנגלית פשוטה
צפו בעדכון התיאור תוך כדי הקלדה זהו השלב שמציל אתכם אם המשפט לא תואם את לוח הזמנים בראשכם הביטוי שגוי, וגיליתם בדפדפן במקום בייצור שבוע לאחר מכן אשר את השעה, הימים וכל הגבלת חודש קרא את הדרך בה אתה מתכוון.
שלב 4: בדוק את הריצות הבאות והעתק
לחץ לתצוגה מקדימה של זמני הריצה הקרובים, מחושבים ב-UTC. סרוק אותם לכל דבר מפתיע - פער ארוך מדי, ריצה ראשונה רחוקה מדי, או רשימה ריקה המאותתת על תאריך בלתי אפשרי. כאשר לוח הזמנים נראה נכון, העתק את הביטוי והדבק אותו במניפסט crontab, pipeline או CronJob שלך.
מלכודת יום-חודש ויום-שבוע
אם אתה זוכר דבר אחד על cron, לעשות את זה זה, כי זה מפתיע כמעט כולם בפעם הראשונה. When שניהם שדה יום החודש ושדה יום השבוע מוגבלים - כלומר גם לא * - cron סטנדרטי משלב אותם עם OR, לא AND. העבודה פועלת כאשר או או התאמה מצב.
כך ש 0 0 13 * 5 לא אומר " חצות ביום שישי ה -13." זה אומר " חצות ב -13 בכל חודש, וגם חצות בכל יום שישי." אלה לוחות זמנים שונים מאוד; השני יורה פעמים רבות בחודש התנהגות זו מגיעה ישר מן היישום המקורי של Vixie cron כי רוב מתזמני לרשת, ואת המחולל מכבד את זה בדיוק. התצוגה המקדימה שלה לרוץ הבא יראה לך הן את ה -13 ואת ימי שישי, אשר היא הדרך הברורה ביותר האפשרית לתפוס OR לא מכוון.
הכלל המעשי: השאר אחד מתחומי היומיים כ * אלא אם כן אתה באמת רוצה את התנהגות OR. אם אתה באמת צריך " יום שישי ה-13 בלבד, " cron לא יכול לבטא את זה בביטוי אחד - אתה מטפל בהיגיון הזה בעבודה שלך. לראות את תאריכי הריצה בפועל בתצוגה המקדימה זה מה שהופך את זה מגוצ'ה אורבת לעובדה ברורה ונראית לעין.
שלבים, טווחים ורשימות בפועל
תחביר הצעדים הוא המקום שבו חי הרבה כוח תזמון, ושם מתחיל הרבה בלבול. */5 בשדה הדקות פירושו דקות 0, 5, 10, 15 וכן הלאה ל-55 - "כל חמש דקות." אתה יכול לעגן צעד לטווח: 0-30/10 פירושו דקות 0, 10, 20, ו-30 בלבד ערך חשוף עם צעד, כמו 5/15 בשדה הדקות, פירושו " החל מ-5, כל 15" עד השדה מקסימום - 5, 20, 35, 50.
רשימות וטווחים משתלבים בחופשיות. 1,4,7,10 בשדה חודש נותן לך לוח זמנים רבעוני - ינואר, אפריל, יולי, אוקטובר. 1-5 ביום בשבוע נותן לך שני עד שישי. 9-17 בשדה שעה נותן לך חלון תשע עד חמש ערבוב אותם, 0 9-17 * * 1-5 קורא כ-" בדקה 0 של כל שעה מ-9 בבוקר עד 5 בערב, שני עד שישי" - דופק נפוץ של שעות עסקים. המחולל מרחיב ומאמת את כל אלה, והתיאור מפרט מה בנית כך שאין אי בהירות לגבי, למשל, האם טווח כולל (זהו).
מקרי שימוש נפוצים
גיבויים ותחזוקה מתוזמנים. עבודת המקורבים הקנונית. לְדַגֵר 0 2 * * * לגיבוי לילי של 2 לפנות בוקר, קראו את התיאור כדי לאשר שהוא יומי ולא שבועי, וצפו בתצוגה מקדימה של הריצות הבאות כדי להיות בטוחים שהראשונה היא הלילה זו הטעות המדויקת שעשיתי לפני שנים, ואת המדויקת שהתצוגה המקדימה מונעת.
CI ולוחות זמנים לפריסה. בנייה לילית, ריצות בדיקה מתוזמנות ופריסות תקופתיות כולם משתמשים בתחביר cron ב-GitHub Actions, GitLab CI ומערכות דומות. בנה את הביטוי כאן, אשר אותו והדבק אותו בקובץ זרימת העבודה שלך. מכיוון שמערכות אלו פועלות על השרתים שלהן, שים לב לסייג אזור הזמן שלהלן.
צינורות נתונים ודוחות. דיווח שבועי בכל יום שני בשעה 6 בבוקר הוא 0 6 * * 1; רולאפ חודשי על הראשון הוא 0 0 1 * *; עבודה רבעונית היא 0 0 1 1,4,7,10 *. יצירת אלה וקריאתם בחזרה עוצרת את הקלאסי " רץ ביום הלא נכון" תקרית בצנרת.
התחממות מטמון ופעימות לב. עבודות בתדירות גבוהה כמו */5 * * * * שמור על חום מטמונים או בדיקות בריאות מתקתקות. התצוגה המקדימה מאשרת שהמרווח הוא מה שאתה מצפה ולא, נניח, פעם בשעה כי אתה שם את הצעד בשדה הלא נכון.
קרונית לומדת. אם אתם עדיין בונים אינטואיציה, המחולל הוא כלי הוראה הקלד ביטוי, קרא את המשפט, ראה את הריצות, והמיפוי בין תחביר להתנהגות הופך לקונקרטי באופן שהתיעוד לבדו לעולם לא מצליח.
הערה על אזורי זמן
התצוגה המקדימה של הריצה הבאה מחשבת זמנים ב-UTC כך שהתוצאה היא דטרמיניסטית ואותה עבור כל מי שקורא את זה. דמוני מקורבים אמיתיים, לעומת זאת, פועלים בשרת ' אזור זמן מקומי אלא אם הוגדר אחרת, ולספקי CI לכל אחד יש מוסכמה משלו - ברירת מחדל רבים ל-UTC, חלקם לא. הביטוי עצמו אינו נושא אזור זמן; המתזמן הוא שמחליט. אז כשאתה מעביר ביטוי מכלי זה למערכת חיה, אשר את אזור הזמן של system' וקיזוז זמני הריצה בראש שלך בהתאם. א 0 0 * * * איוב הוא חצות - אבל חצות איפה תלוי לחלוטין היכן העבודה פועלת. אם אתה צריך לנמק לגבי קיזוז אזור זמן, ה ממיר timezone שימושי, וה ממיר חותמת זמן עוזר כאשר יומני המתזמן שלך פועלים כחותמות זמן של יוניקס.
יצירה מול ניתוח של ביטוי
כלי זה בונה ביטוי משדות אחיו, ה מנתח ביטוי cron, הולך לכיוון השני: הדבק ביטוי קיים והוא מסביר אותו ומציג תצוגה מקדימה של הריצות שלו השניים מכסים את שני הכיוונים של אותה בעיה השתמש במחולל כאשר אתה יודע את לוח הזמנים שאתה רוצה וצריך את התחביר; השתמש במנתח כאשר ירשת ביטוי וצריך להבין מה הוא עושה שניהם מכבדים את אותה סמנטיקה של ויקסי-קרון, כולל כלל יום-חודש או יום-שבוע, כך שהתיאור שקראת באחד תואם את ההתנהגות שהיית רואה בשני יחד הם זוג קטן וממוקד בתוך הערכה הרחבה יותר שאני מתאר ב ערכת כלים למפתחי אינטרנט סקירה כללית והרחבה יותר מדריך כלי קידוד.
פרטיות: הכל פועל בדפדפן שלך
אין מה להעלות כאן, ושום דבר לא מועלה הביטוי בנוי, מאומת, מתואר, ומדומה כולו בקוד צד לקוח זה משנה יותר ממה שזה עשוי להיראות: לוחות זמנים עבודה פנימיים יכולים לחשוף דברים על מערכת's ארכיטקטורה וקצב שלא היית רוצה לשבת בצד שלישי's יומני. אתה יכול לאשר שהכלי הוא עצמאי על ידי ניתוק מהאינטרנט - הוא ממשיך לעבוד זהו אותו עיקרון צד לקוח מאחורי כל כלי ב-Toolz.dev, שאני טוען את הטענה המלאה עבורו ב פרטיות נתונים בכלים מקוונים מאמר.
שָׁוא
איך אני כותב ביטוי cron?
לביטוי cron סטנדרטי יש חמישה שדות המופרדים ברווחים: דקה, שעה, יום בחודש, חודש ויום בשבוע. כל שדה הוא ערך ספציפי, רשימה, טווח, שלב או * לכל. לדוגמה, 0 8 * * 1-5 פירושו בשעה 08:00 בימים שני עד שישי כלי זה בונה את הביטוי עבורך ומראה מה זה אומר תוך כדי.
מה המשמעות של חמשת שדות הקרון?
משמאל לימין הם דקה (0–59), שעה (0–23), יום בחודש (1–31), חודש (1–12) ויום בשבוע (0–6, כאשר 0 ו-7 שניהם פירושם יום ראשון). כוכב בשדה פירושו "every" הערך של אותו שדה הכלי מסמן כל שדה כך שאינך צריך לזכור את ההזמנה.
מה עושה */5 מתכוון בקרון?
הלוכסן מציג ערך צעד. בשדה הדקה, */5 פירושו "כל 5 דקות" - 0, 5, 10, 15 וכן הלאה. אתה יכול לשלב שלבים גם עם טווחים: 0-30/10 בשדה הדקות פירושו דקות 0, 10, 20 ו-30. שלבים הם הדרך הסטנדרטית לבטא "כל N יחידות."
מדוע העבודה שלי פועלת בתדירות גבוהה מהצפוי עם יום בחודש ויום בשבוע?
זוהי הפתעת המקורבים הנפוצה ביותר. כאשר גם שדות היום-חודש וגם שדות היום-שבוע מוגבלים (אף אחד מהם אינו מוגבל *), cron סטנדרטי מתייחס אליהם כאל OR, לא AND - העבודה פועלת כאשר אחד מהתנאים תואם. כך 0 0 13 * 5 פועל ב-13 לחודש ובכל יום שישי, לא רק בשישי ה-13 השאירו מגרש אחד כמו * אלא אם כן אתה באמת רוצה את התנהגות ה-OR.
באיזה אזור זמן מוצגים זמני הריצה הבאים?
התצוגה המקדימה מחשבת ריצות קרובות ב-UTC כך שהתוצאה זהה לכולם. דמוני קרונים אמיתיים משתמשים באזור הזמן של השרת (או בהגדרת TZ), כך שאם השרת שלך פועל באזור אחר, קיזוז את הזמנים בהתאם. הביטוי עצמו אינו נושא אזור זמן - המתזמן הוא זה שמחליט.
האם אני יכול להשתמש בשמות כמו יום שני או יאן במקום מספרים?
כן. שדה החודש מקבל JAN דרך DEC ושדה יום השבוע מקבל SUN דרך SAT, חסר רגישות רישיות הכלי מבין אותם בעת אימות ותיאור הביטוי שלך ערכים מספריים ניידים יותר בין מתזמנים, כך שהמחולל פולט מספרים, אך קלט בשם נתמך באופן מלא.
האם זה זהה לתחביר crontab?
כן, זה יוצר מקורב Unix/Vixie סטנדרטי בן חמישה שדות המשמש את crontab, רוב מערכות ה-CI ו-Kubernetes CronJobs. מתזמנים מסוימים מוסיפים שדה של שניות שישית או הרחבות לא סטנדרטיות כמו @reboot; אלה אינם חלק מתקן חמשת השדות עבור הרוב המכריע של צרכי התזמון, הביטוי של חמשת השדות שהכלי הזה מייצר הוא בדיוק מה שאתה רוצה.
האם לוח הזמנים שלי נשלח לכל מקום?
מס 'הביטוי בנוי, מאומת, מתואר, ומדומה לחלוטין בדפדפן שלך עם קוד בצד הלקוח שום דבר לא מועלה או מאוחסן אתה יכול לאשר זאת על ידי ניתוק מהאינטרנט - המחולל עדיין עובד.



