כיצד להשתמש ב-cron

מתוך הויקי של ג'נטו.

קפיצה אל: ניווט, חיפוש

מדריך התקנה זה הוא תרגום של מדריך ה-Cron הרשמי של לינוקס ג'נטו.

תוכן המדריך מוגן בזכויות יוצרים של כותבי המדריך המקורי.

התרגום בוצע באישור הרשיון שבו פורסם המסמך המקורי, Creative Commons - Attribution / Share Alike.

על התרגום חלים אותם תנאי רשיון כמו למקור התוכן. המדריך תורגם על ידי oc666.

תוכן העניינים

[עריכה] הבסיס של Cron

[עריכה] מה עושה Cron

Cron הוא כלי שמריץ משימות באופן מתוזמן ומבוסס על הקלט של הפקודה crontab. הוא מבצע את המשימות ע"י בדיקה מחזורית כל דקה האם צריך לבצע משימת-cron.

שים לב: crontab הוא גם השם של רשימת המשימות וגם השם של הפקודה שעורכת את הרשימה הזו.

[עריכה] Cron בפועל

יש לפחות שלושה כלי Cron שתוכל לבחור מהפורטאג'. כולם מציעים ממשק דומה, המשתמש בפקודה crontab או פקודה דומה. יש גם כלי שנקרא Anacron, אשר בשימוש במערכות שלא פועלות באופן ממושך.

כל שלושת החבילות נשענות על sys-process/cronbase. אולם חבילה זאת לא תלויה טכנית על כל שלושת כלי ה-cron במישרין, אבל חבילה זו מספקת פונקציונליות של Cron אשר כלל המשתמשים יעריכו.

לפני שנתחיל לעבוד עם Cron, תצטרך לבחור באיזה ישום תרצה להשתמש. לנוחות שלך, אספנו מידע על כל כלי Cron וזאת מוצג בהמשך.

[עריכה] איזה Cron הכי טוב בשבילך?

[עריכה] Vixie Cron

Vixie cron הוא ישום מלא אופציות של Cron המבוסס על SysV cron. לכל משתמש יש את המשימות שלו וזה מאפשר להגדיר משתני סביבת העבודה בתוך ה-crontab. בניגוד לשאר ה-Cron-ים, Cron זה מאפשר תמיכה ב-SELinux וPAM. זה תומך בפחות ארכיטקטורות מאשר Dcron, אבל יותר מאשר Fcron.

מאפייני sys-process/vixie-cron:

  • תמיכה ב-SELinux.
  • תמיכה ב-PAM וב-etc/security/limits.conf/.
  • אתחול משתני סביבת עבודה בתוך המשימה (כמו: PATH, SHELL, HOME וכו').
  • לכל משתמש יש משימות משלו, גישה מבוקרת ע"י cron.allow ו-cron.deny.

[עריכה] Dillon's Cron

Dillon's Cron מתיימר להיות ישום פשוט, אלגנטי ומאובטח של Cron. הוא לא מאפשר הגדרת של משתני סביבה במשימות שלו וכל המשימות שלו רצות מ-bin/sh/ כמו Vixie cron, ולכל משתמש יש את המשימות שלו.

מאפייני sys-process/dcron:

  • מהיר, פשוט ונטול מאפיינים לא נחוצים.
  • גישה למשימות מוגבלת לקבוצת cron. הוא לא נשען על כלים חיצוניים.

==

[עריכה] כותרת

==

[עריכה] כותרת

==

[עריכה] כותרת

==

[עריכה] כותרת

==

[עריכה] FCron

Fcron מתיימר להחליף את Vixie cron ואת Anacron. הוא מעוצב לעבוד על מערכות שלא עובדות באופן ממושך והוא ארוז עם אפשרויות נרחבות. לכלי יש את היכולת למספר עבודות ואת היכולת לתזמן משימות בעלייה של המערכת. ראה גם את עמוד הבית של fcron.

מאפייני sys-process/fcron:

  • מעוצב לעבוד על מערכות שלא עובדות באופן ממושך. ז"א, מסוגל להריץ עבודה אחרי אתחול גם אם היא הוחמצה.
  • אפשרות לאתחל משתני סביבה ועוד הרבה אפשרויות בתוך המשימה (crontab).
  • לכל משתמש יש את המשימות שלו, גישה מבוקרת ע"י cron.allow ו-cron.deny.
  • תחביר crontab מורחב עם תמיכה באפשרויות רבות.

[עריכה] Anacron

Anacron אינו מתזמן משימות, זהו כלי העובד בשיתוף עם אחד מהכלים לעיל. הוא מריץ פקודות במרווחי זמן של ימים והוא לא מניח שהמערכת רצה באופן ממושך; הוא מריץ משימות שהוחמצו בזמן שהמערכת היתה כבויה. Anacron בד"כ נשען על מתזמן משימות כדי להריץ זאת בכל יום.

[עריכה] שימוש ב-cron

[עריכה] התקנה

בחר את יישום ה-cron שתאהב יותר מכל, ואז תאמרג' אותו:

קוד: התקנת cron
# emerge dcron
# /etc/init.d/dcron start
# rc-update add dcron default

אפשרות אחרת: אם לא התקנת את Fcron, תרצה בוודאי להתקין את Anacron.

קוד: התקנת anacron
# emerge anacron
# /etc/init.d/anacron start
# rc-update add anacron default

[עריכה] מערכת crontab

כל מיני הודעות לאחר התקנה מאחד חבילות ה-cron יאמרו לך להריץ crontab /etc/crontab. הקובץ ‎/etc/crontab הוא מערכת crontab. התקנת cron יכולה להשתמש בחיבור עם sys-process/cronbase כדי להריץ תסריטים (סקריפטים) ב-‎/etc/cron.{daily,hourly,weekly,monthly}. שים לב שרק Vixie-cron מתזמן משימות ב-‎/etc/crontab באופן אוטומטי. משתמשי Dcron ו-Fcron יצטרכו להריץ crontab /etc/crontab כל פעם שהם יעשו שינויים ב-‎/etc/crontab.

שים לב גם שעבודות שמתוזמנות במערכת crontab יוכלו לא להופיע ברשימת המשימות שיופיעו בפקודה crontab -l.

כמובן, תוכל לבחור לא להשתמש בכלל במערכת crontab. אם בחרת ב-Dcron או ב-Fcron, אל תריץ crontab /etc/crontab. אם בחרת vixie-cron, תצטרך לסמן כהערה את כל השורות בקובץ etc/crontab/.

קוד: סימון הערות בכל שורות הקובץ /etc/crontab
# sed -i -e "s/^/#/" /etc/crontab

[עריכה] מתן גישה למשתמשים מורשים

אם תרצה לאפשר למשתמשים אחרים חוץ ממשתמש מנהל (root) לגשת למתזמן המשימות, תצטרך לקרוא את החלק הזה, אחרת, דלג לחלק הבא תזמון משימות.

שים לב: מתן הרשאה למשתמש אחר למתזמן המשימות לא מאפשר למשתמש להריץ משימות כמשתמש מנהל. אם תרצה שהמשתמש יוכל לערוך משימות מנהל, תצטרך להשתמש ב-sudo. אתה מוזמן לקרוא על נושא זה בהרחבה.

לא עקרוני איזו חבילת cron תשתמש אם תרצה לאפשר למשתמש להשתמש ב-crontab, הוא יצטרך קודם להיות חבר בקבוצת ההרשאות cron. לדוגמא, אם תרצה לאפשר להוסיף את wepy לקבוצת ההרשאות cron תריץ את הפקודה הבאה:

קוד: הוספת משתמש לקבוצת ההרשאות cron
# gpasswd -a wepy cron
שים לב: כאשר תוסיף משתמש לקבוצת ההרשאות cron, וודא שהמשתמש יוצא ונכנס למערכת כדי שהעדכון יתבצע.

אם אתה משתמש ב-Dcron, זה כל מה שתצטרך על-מנת לאפשר למשתמש גישה למשימות. משתמשי Dcron יצטרכו להמשיך לחלק תזמון משימות, השאר ירצו להמשיך לקרוא.

אם אתה משתמש ב-Fcron תרצה בוודאי לערוך את ‎/etc/fcron/fcron.deny ואת ‎/etc/fcron/fcron.allow. הדרך המאובטחת ביותר היא קודם כל לחסום את כל המשתמשים בקובץ ‎/etc/fcron/fcron.deny, ואח"כ לתת גישה למשתמשים מסוימים בקובץ ‎/etc/fcron/fcron.allow.

חשוב: אם שני קבצים אלו (הקובץ ‎/etc/fcron/fcron.allow והקובץ ‎/etc/fcron/fcron.deny) אינם קיימים, כל המשתמשים בקבוצת ההרשאות cron יהיו מורשים להשתמש במתזמן המשימות (crontab). חבילת fcron באה כברירת מחדל עם הקובץ ‎fcron.allow שמאפשרת גישה לכל המשתמשים בקבוצת ההרשאות cron ל-fcrontab.

קובץ: הרשאות בקובץ fcron.deny

all

עכשיו, נניח כי המשתמש wepy קיים במערכת שלנו ואפשרנו לו לתזמן משימות משלו. אנחנו נצטרך להוסיף אותו לקובץ ‎/etc/fcron/fcron.allow כדלקמן:

קובץ: הרשאות בקובץ fcron.allow

wepy

אם בחרת ב-Vixie cron, קרוב לוודאי שתצטרך לערוך רק את הקובץ ‎/etc/cron.allow.

חשוב: יש לשים לב שאם רק הקובץ ‎/etc/cron.allow קיים, אז רק משתמשים בקבוצת המשתמשים cron תהיה להם גישה, אבל, אם רק הקובץ ‎/etc/cron.deny קיים אז לכל המשתמשים בקבוצת ההרשאות cron תהיה גישה! אל תשאיר את הקובץ ‎/etc/cron.deny ריק אם הקובץ ‎/etc/cron.allow אינו קיים.

לדוגמא, אם תרצה לאפשר גישה למשתמש wepy, עליך להוסיף אותו לקובץ ‎/etc/cron.allow כדלקמן:

קובץ: הרשאות בקובץ fcron.allow

wepy

[עריכה] תזמון משימות

התהליך של עריכת משימות הוא די שונה בין כל חבילה, אבל כולן תומכות באותו בסיס של פקודות: הוספה והחלפת משימות, עריכת משימות, מחיקת משימות ומבנה רשימת המשימות. הרשימה הבאה מראה לך כיצד להריץ פקודות אלו לכל חבילה:

חבילה

עריכת משימה

מחיקת משימה

משימה חדשה

רשימת המשימות

dcron

crontab -e

crontab -d [user]

crontab file

crontab -l

fcron

fcrontab -e

fcrontab -r [user]

fcrontab file

fcrontab -l

vixie-cron

crontab -e

crontab -r -u [user]

crontab file

crontab -l

שים לב:
  • כאשר משתמשים בפקודה של מחיקת משימה, אם לא מסופק ארגומנט לפקודה, הפקודה תמחק את המשימה של המשתמש הנוכחי.
  • ל-Fcron יש גם קישור (symlink) מ-crontab ל-fcrontab.

לפני שנוכל להשתמש בפקודות הנ"ל, תצטרך קודם להבין את ה-crontab עצמו וכיצד הוא עובד. כל שורה בקובץ ה-crontab צריכה להכיל חמיש ה שדות של זמנים בסדר הבא: דקות (0-59), שעות (0-23), ימים בחודש (1-31), חודשים (1-12) וימים בשבוע (0-7, יום שני הוא אחד, יום ראשון הוא 0 וגם 7). הימים בשבוע והחודשים יכולים להירשם גם כשלושה אותיות בקיצור כמו: mon, tue, jan, feb וכו'. כל שדה יכול להכיל טווח ערכים (כמו, 1-5 או mon-fri), רשימה מופרדת בפסיקים (כמו, 1,2,3 או mon,tue,wed) או טווח ערכים עם רווחים קבועים (כמו, 1-6/2 שזה בדיוק כמו 1,3,5).

נשמע קצת מבלבל, אבל כמה דוגמאות ותראה שזה לא מסובך כפי שזה נשמע.

קוד: דוגמאות
# הרצת הפקודה bin/false/ כל דקה בכל השנה
*     *     *     *     *        /bin/false

# הרצת הפקודה bin/false/ בשעה 1:35 בימים שני, שלישי וחמישי, וב-4 של כל חודש
35    1     4     *     mon-wed  /bin/false

# הרצת bin/true/ בשעה 22:35 בשני לחודש מרץ
25    22    2     3     *        /bin/true

# הרצת הפקודה bin/false/ בשעה 2:00 כל יום שני, רביעי ושישי
0     2     *     *     1-5/2    /bin/false
שים לב: כיצד תוכל לפרט על ימים מסוימים בשבוע וימים מסוימים בחודש לפני שהם משולבים. אם יש לך סימון (*) עבור רק אחד מהם, לשני יש עדיפות, כאשר סימון עבור שניהם מורה על הרצה יומית.

כדי לבחון את מה שלמדנו כרגע, בוא נעבור על השלבים בהכנת מספר משימות. קודם כל, צור קובץ בשם crons.cron במבנה הבא:

קוד: עריכת הקובץ crons.cron
$ nano crons.cron
#Mins  Hours  Days   Months  Day of the week
10     3      1      1       *       /bin/echo "I don't really like cron"
30     16     *      1,2     *       /bin/echo "I like cron a little"
*      *      *      1-12/2  *       /bin/echo "I really like cron"

עכשיו נוכל לתזמן משימות חדשות עבור המערכת עם הפקודה משימה חדשה מהטבלה למעלה.

קוד: תזמון משימה חדשה
# crontab crons.cron
שים לב: לא תוכל לראות פלט מפקודה זו, אלא אם תנתב את הפלט.

כדי לוודא שאכן תזמנת נכונה את המשימה, נשתמש בפקודה המתאימה לרשימת המשימות מהטבלה למעלה.

קוד: רשימת המשימות
# crontab -l

תצטרך לראות מעין רשימה של הקובץ crons.cron, אם לא, אולי השתמשת לא נכון בפקודה לתזמון משימה חדשה.

המשימה אמורה לפלוט "I really like cron" כל דקה בכל שעה בכל יום בכל חודש. למען האמת, תרצה לעשות זאת אם אתה באמת אוהב את cron. המשימה הזו גם תפלוט "I like cron a little" בשעה 16:30 בכל יום בחודש ינואר ופברואר. כמו כן, זה גם יפלוט "I don't really like cron" בשעה 3:10 בראשון לחודש ינואר. אם אתה משתמש ב-Anacron, תצטרך להמשיך לקרוא את הפרק הזה. אחרת המשך לפרק עריכת משימות.

משתמשי Anacron ירצו לערוך את הקובץ etc/anacrontab/. קובץ זה מכיל ארבעה שדות: מספר הימים בין כל הרצה, ההשהיה בדקות אחרי כל הרצה, שם המשימה והפקודה שיש להריץ.

לדוגמא, כדי להריץ את הפקודה echo "I like anacron" כל 5 ימים, 15 דקות לאחר פתיחת Anacron:

קובץ: /etc/anacrontab
5 10 wasting-time /bin/echo "I like anacron"

Anacron יוצא לאחר שכל המשימות ב-anacrontab מסתיימות, לכן אם נרצה לבדוק משימות אלו כל יום, נצטרך להשתמש ב-cron. ההוראות בסוף הפרק הבא יורו לך איך לעשות זאת.

[עריכה] עריכת משימות

בכל זאת, בואו נהיה ריאליסטיים - לא תרצה שהמערכת שלך תאמר לך כמה אתה אוהב את ה-cron שלך כל דקה. ניקח צעד קדימה, בואו נמחק את המשימה הנ"ל ע"י שימוש בפקודה המתאימה למחיקת משימה מהטבלה למעלה. נרצה גם לפלוט את רשימת המשימות לאחר מכן רק כדי לוודא שביצענו זאת נכונה.

קוד: מחיקת משימה מתוזמנת
# crontab -d
# crontab -l

קרוב לוודאי שלא תראה שום משימת cron בפלט מהפקודה crontab -l. אם תראה רשימת משימות, זה אומר כי לא הצלחנו למחוק את המשימה ברשימה, ותצטרך לוודא שהשתמשת בפקודה הנכונה למחיקת משימה בהתאם לחבילת ה-cron שלך.

עכשיו כשפתחנו דף חדש, בואו נשים משהו שימושי לתוך רשימת המשימות של משתמש המנהל (root). רוב האנשים ירצו להריץ את הפקודה updatedb בכל שבוע כדי לוודא שהפקודה slocate עובדת נכון. כדי להוסיף זאת לרשימת המשימות, נערוך קודם את הקובץ crons.cron שוב, כך שהוא יראה כך:

קובץ: crontab אמיתי
22 2 * * 1    /usr/bin/updatedb

זה יגרום ל-cron להריץ את הפקודה updatedb בשעה 2:22 (AM) ביום שני בכל שבוע. תצטרך עכשיו להוסיף את המשימה ל-crontab באמצעות הפקודה המתאימה משימה חדשה מהטבלה מעלה ונבדוק שוב את רשימת המשימות.

קוד: משימה חדשה ורשימת המשימות
# crontab crons.cron
# crontab -l

עכשיו נניח שתרצה להוסיף את הפקודה emerge --sync להרצה היומית שלך. תוכל לעשות זאת קודם באמצעות עריכת הקובץ crons.cron ואז להשתמש בפקודה crontab crons.cron כפי שעשינו זאת קודם, או שתוכל לעשות זאת בעזרת הפקודה המתאימה עריכת משימה מהטבלה למעלה. זה נותן לך דרך לערוך את משימות המשתמש שלך, ללא תלות בקבצים חיצוניים כמו crons.cron.

קוד: תחליף לעריכת משימה
# crontab -e

זה אמור לפתוח את המשימה בעזרת העורך. נרצה שהפקודה emerge --sync תרוץ כל יום בשעה 6:30 (AM), לכן נרצה שזה יראה משהו כמו זה:

קובץ: crontab אמיתי
22 2 * * 1    /usr/bin/updatedb
30 6 * * *    /usr/bin/emerge --sync
(if you're using anacron, add this line)
30 7 * * *    /usr/sbin/anacron -s

שוב, בדוק את רשימת המשימות כמו שעשינו בדוגמאות הקודמות כדי לוודא שהמשימות תוזמנו נכונה. אם כולן במקום, אז הכל מוכן.

[עריכה] שימוש ב-cronbase

[עריכה] מה זה cronbase?

כפי שהוסבר קודם לכן, כל שלושת חבילות ה-cron הזמינות תלויות על sys-process/cronbase. חבילת ה-cronbase י‎וצרת‏ ‎ /etc/cron.{hourly,daily,weekly,monthly} , וסקריפט שנקרא run-crons. בטח שמת לב שברירת המחדל etc/crontab/ משהו כמו זה:

קובץ: מערכת crontab ברירת מחדל
*/15 * * * *     test -x /usr/sbin/run-crons && /usr/sbin/run-crons
0  *  * * *      rm -f /var/spool/cron/lastrun/cron.hourly
0  3  * * *      rm -f /var/spool/cron/lastrun/cron.daily
15 4  * * 6      rm -f /var/spool/cron/lastrun/cron.weekly
30 5  1 * *      rm -f /var/spool/cron/lastrun/cron.monthly

כדי להימנע מלרדת לפרטים, נוכל רק להניח שפקודות אלה ישפיעו על הרצת סקריפטים כל שעה, יומית, שבועית וחודשית. שיטה זו של תזמון משימות בעלת מספר יתרונות:

  • המשימות ירוצו גם אם המחשב שלך היה כבוי בזמן שהמשימות תוזמנו לרוץ.
  • זה מקל על תחזוקת חבילות כדי למקם סקריפטים במקומות קבועים.
  • אתה יודע בדיוק היכן המשימות וה-crontab שלך מאוחסנות, וכך זה הופך יותר נוח בשביל גיבוי ושחזור.
שים לב: שוב, חשוב להזכיר ש-vixie-cron קורא באופן אוטומטי את etc/crontab/, בעוד fcron ו-dcron לא עושים זאת. קרא את הפרק מערכת crontab שוב כדי ללמוד על זאת עוד.

[עריכה] הוספת משימה ל-cronbase

לאחר התקנת ה-cronbase תוכל להוסיף בקלות משימות. נסביר זאת בעזרת דוגמא.

נניח, שנרצה להריץ את הפקודה logwatch.pl פעם ביום (Logwatch שולחת מייל למנהל המערכת עם ניתוח תמציתי לגבי קבצי הלוג של המערכת וכך תוכל לעקוב מי נכנס למערכת שלך ומתי, אם הדיסקים שלך מלאים ועוד חומר שימושי). תוכל להתקין את זאת בעזרת הפקודה emerge logwatch.

כדי להריץ את Logwatch פעם ביום כנס לספריה ‎/etc/cron.daily והוסף קובץ בשם logwatch.cron; בקובץ זה כתוב את שם היישום שתרצה להריץ (מלא בו את הנתיב המלא והמוחלט של הישום). אם אינך בטוח מהו שם היישום, היעזר בפקודה which, למשל, בדוגמא שלנו הרץ which logwatch.pl.

קובץ: /etc/cron.daily/logwatch.cron
#! /bin/sh
/usr/sbin/logwatch.pl

דבר אחרון שתרצה לעשות הוא להפוך את הקובץ לבר הרצה.

קוד: הפיכת קובץ סקריפט לבר-הרצה
# chmod +x /etc/cron.daily/logwatch.cron

עכשיו, Logwatch ירוץ כל יום וישלח מייל למשתמש מנהל.

טיפ! תוכל להריץ גם קבצי סקריפט המכילים מספר פקודות לשם יעול ואוטומציית המערכת שלך. בדוק סקריפטים אחרים ב-*.etc/cron/ עבור דוגמאות נוספות.

[עריכה] הערות אחרונות

[עריכה] איתור וטיפול בבעיות

אם אתה חווה בעיות מסוימות עם מערכת ה-cron, אולי תרצה לעבור על הרשימה הבאה:

  • האם cron רץ?
הרץ את הפקודה הבאה: ps ax | grep cron וודא שהכל עולה.
  • האם cron עובד?
נסה: * * * * * /bin/echo "foobar" >> /file_you_own וודא שזה עובד.
  • האם הפקודה עובדת?
נסה: * * * * * /bin/foobar > /file_you_own 2>&1 ובדוק האם יש הודעות שגיאה בקובץ file_you_own/.
  • האם אתה יכול להריץ משימות?
בדוק את לוג ה-cron, בד"כ הוא בקובץ var/log/cron.log/ או את הקובץ var/log/messages/ אם הם מכילים הודעות שגיאה.
  • האם יש "אותיות מתות" כלשהן?
cron בד"כ שולח מייל כאשר ישנה בעיה, בדוק את המייל שלך ובנוסף חפש את הקובץ dead.letter/~.

זכור, כל חבילת cron שונה מחברתה באופן ניכר וכך גם מספר האפשרויות המגוונות בכל אחת כזו. אל תהסס לבדוק את דפי העזרה (man pages) של fcrontab, crontab או anacrontab, בהתאם למה שאתה משתמש.

[עריכה] קישורים נוספים

כלים אישיים
שפות אחרות