עבור לתוכן

מפענח cron

הדביקו את השורה מה-crontab וגלו מתי היא באמת רצה. לפני שהיא תרוץ בשלוש בלילה ביום הלא נכון.

רץ בדפדפן שלכם. שום דבר שתדביקו או תגררו לכאן לא מועלה לשום מקום.

חמישה שדות, קיצור עם @, או שורת crontab שלמה עם הפקודה.

מוכנים
  1. 0דקה:000–59
  2. 3שעה03:xx0–23
  3. *יום בחודשכל יום1–31
  4. *חודשכל חודש1–12, JAN–DEC
  5. 1-5יום בשבועב׳–ו׳0–7, SUN–SAT
במילים פשוטות

בשעה 03:00, בימים שני עד שישי.

10 ההרצות הבאות

    שרתים מריצים cron הרבה פעמים ב-UTC. בדקו עם date או timedatectl בשרת.

    7 הימים הקרובים, שעה אחרי שעה

    איך משתמשים

    4 צעדים
    1. הדביקו שורת crontab: חמישה שדות, קיצור כמו @daily, או את כל השורה כולל הפקודה.
    2. קראו את המשפט. העמידו את הסמן על שדה כדי להדגיש אותו בפירוק.
    3. בדקו את האזהרות. הן תופסות את הטעויות הקלאסיות: * בשדה הדקות, יום 31, וכלל ה-OR של יום בחודש ויום בשבוע.
    4. הסתכלו על 10 ההרצות הבאות. עברו ל-UTC אם השרת רץ ב-UTC, ורובם כן.

    מה זה עושה

    דקת קריאה

    cron קורא חמישה שדות משמאל לימין: דקה, שעה, יום בחודש, חודש, יום בשבוע. 0 3 * * 1-5 פירושו 03:00 בימים שני עד שישי. בכל שדה אפשר לכתוב מספרים, טווחים (1-5), רשימות (1,15), צעדים (*/15), ולחודשים ולימים גם שמות כמו JAN ו-MON. יום ראשון הוא גם 0 וגם 7.

    הכלי עובד לפי Vixie cron ו-cronie, ה-cron שמותקן ברוב שרתי הלינוקס. הוא מזהה גם ביטויים של שישה שדות עם שניות (node-cron,‏ Quartz,‏ Spring) ואת התחביר של Quartz בלבד, ? L W #, ואומר כששורה לא תעבוד ב-crontab רגיל.

    ההרצות הבאות מחושבות בדפדפן, לפי אזור הזמן שלכם או לפי UTC. שעון קיץ מטופל כמו שהדפדפן רואה אותו: זמן שנופל לשעה ש„נעלמה” עובר לדקה הראשונה אחריה ומסומן. מימושי cron שונים מתנהגים כאן אחרת, אז אל תתזמנו בין 02:00 ל-03:00 אם השרת עובד לפי שעון מקומי.

    רוב משימות ה-cron באתרים קטנים משעממות וחשובות: חידוש תעודות עם certbot, גיבויים לפני העברת חשבון cPanel, והרצת משימות של וורדפרס עם cron אמיתי במקום WP-Cron, כמו בצ׳קליסט האבטחה לוורדפרס. cron שבור לא זורק שגיאות. הוא פשוט מפסיק לעשות דברים.

    שאלות

    5 שאלות

    מה פירוש */5 ב-cron?

    */5 פירושו כל ערך חמישי, החל מהנמוך ביותר. בשדה הדקות זה :00, :05, :10 וכן הלאה, כלומר כל 5 דקות. הצעד מתחיל מחדש בכל שעה, ולכן צעדים ש-60 לא מתחלק בהם (כמו */7) משאירים פער קצר בתחילת השעה. 10-30/5 מגביל את אותו צעד לדקות 10 עד 30.

    למה משימת ה-cron שלי רצה ביום הלא נכון?

    כנראה בגלל הכלל של יום בחודש ויום בשבוע. אם שני השדות מוגדרים, cron מריץ כשאחד מהם מתאים. 0 0 1 * 1 ירוץ ב-1 לחודש וגם בכל יום שני, לא רק ביום שני שנופל על ה-1. שדה שמתחיל ב-*, כמו */2, נחשב לא מוגדר והופך את הכלל ל„שניהם חייבים להתאים”. בשביל „יום שני הראשון בחודש”, כתבו 1-7 ביום בחודש, * ביום בשבוע, ובדקו את היום בשבוע בתוך הפקודה.

    באיזה אזור זמן cron עובד?

    באזור הזמן של מערכת השרת, אלא אם ה-cron שלכם תומך ב-CRON_TZ (‏cronie תומך) או שהמשימה מגדירה TZ בעצמה. הרבה שרתים רצים ב-UTC, אז 0 3 * * * יכול לרוץ ב-06:00 לפי השעון שלכם. בדקו עם date או timedatectl בשרת, והשתמשו במתג UTC למעלה.

    למה הפקודה עובדת בטרמינל אבל לא ב-cron?

    cron מריץ אותה בסביבה מינימלית: PATH קצר, בלי aliases, לפעמים shell אחר, ו-% פירושו שורה חדשה. כתבו נתיבים מלאים כמו /usr/bin/php, כתבו % כ-\%, והפנו את הפלט לקובץ לוג (>> /tmp/job.log 2>&1) כדי לראות מה השתבש.

    איך רואים ועורכים את משימות ה-cron שלי?

    ‏crontab -l מציג את המשימות שלכם ו-crontab -e פותח אותן בעורך. לכל משתמש יש crontab משלו, אז משימה שנוספה בתור root לא תופיע אצל המשתמש שלכם: sudo crontab -l מציג את של root. משימות מערכת יושבות גם ב-/etc/crontab וב-/etc/cron.d/, ובשורות האלה יש שדה נוסף בין התזמון לפקודה: המשתמש שבשמו מריצים. באחסון משותף בלי גישת shell, חפשו את Cron Jobs ב-cPanel.

    עוד כלים על הקיר