מבוא ל Cron ו-Anacron

נחום מזרחי

i AT_NO_SPAM pashosh.co.il

היסטוריית גירסאות
גירסה 1.1 05-04-2007 כתריאל טראום
הומר לפורמאט וויקי
גירסה 1.0 25-07-2003 נחום מזרחי
שחרור ראשון

זכויות יוצרים ורשיון

כל הזכויות שמורות © 2007, כתריאל טראום, הרשות ניתנת להעתיק, לשנות ולהפיץ מדריך זה תחת התנאים של רשיון ה-GFDL

Linux הוא סימן מסחרי רשום של Linus Torvalds.

הסרת אחריות

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

משוב

תגובות, תלונות, הערות והארות לכתובת הנ”ל.

מבוא

אוטומציה של ביצוע פעולות

במערכת לינוקס (ובעצם בכל מערכת הפעלה) יש פעולות שאנו מבצעים (או צריכים לבצע) בזמנים קבועים. בין הפעולות האלו נוכל למנות את הגיבויים, ניקוי קבצי לוג, יצירת דו”חות, מחיקת קבצים זמניים ועוד.
את הפעולות האלו יש לבצע בזמנים קבועים ואי ביצוען יכול להוביל לאבדן מידע, לאי-אחידות בהצגת נתונים ולבעיות נוספות.

לצורך פתרון בעיות אלו נוצרו כלים לאוטומציה של ביצוע פעולות. כלי האוטומציה מאפשרים לנו לקבוע מועד לביצוע פעולה כך שהמערכת תבצע אותה באופן אוטומטי.
ניתן לקבוע זמנים קבועים (פעם בשבוע, פעם בחודש, בכל יום בשעה 16:15, כל 10 דקות בימי שני ושלישי וכו') וניתן לקבוע זמן ביצוע יחיד לפעולה חד-פעמית.

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

מדריך זה מסביר את השימוש בכלי אוטומציה אלו תחת מערכת redhat אך בשינויים קלים יתאים עבור מערכות אחרות.

הכלים לביצוע אוטומציה

כדי לבצע משימות/פעולות באופן אוטומטי ישנם שלושה כלים:

  1. cron משמש לביצוע פעולות במרווחי זמן מוגדרים מראש. שרות זה מניח שהמערכת מופעלת תמידית ולכן כל המשימות המתוזמנות ע”י שרות זה מתבטלות בזמן בו המערכת מושבתת.
  2. anacron משמש אף הוא לביצוע פעולות במרווחי זמן מוגדרים מראש אך במידה ופעולה לא התבצעה, הוא מבצע אותה בזמן הקרוב ביותר האפשרי.
  3. at,batch משמשות להגדרת זמן מדוייק לביצוע חד פעמי של פעולה.

בפרקים הבאים אסקור את שלושת השיטות שתוארו.

cron

crontab / crond

מערכת Redhat מותקנת עם השרות הזה כברירת מחדל. במידה והשרות לא מותקן, נחפש ונתקין חבילה בשם vixie-cron.

על מנת לוודא שהשרות מופעל:

[root@MySystem etc]# service crond status

במידה והוא אינו פועל יש להפעילו ע”י

[root@MySystem etc]# service crond start

במקרה זה יש לשים לב שהפעלה זו היא חד פעמית ויש צורך “לקבע” אותה. לפרטים נוספים יש לקרוא במדריכים הרלוונטיים.

הקובץ המשמש להגדרת המשימות המתוזמנות הוא /etc/crontab

ובברירת המחדל הוא נראה כך:

SHELL=/bin/bash
PATH=/sbin:/bin:/usr/sbin:/usr/bin
MAILTO=root
HOME=/

# run-parts
01 * * * * root run-parts /etc/cron.hourly
02 4 * * * root run-parts /etc/cron.daily
22 4 * * 0 root run-parts /etc/cron.weekly
42 4 1 * * root run-parts /etc/cron.monthly
  • השורה הראשונה מגדירה את המעטפת שתבצע את הפקודה. במקרה זה תבוצע הפקודה ע”י bash.
  • השורה השניה מגדירה את הנתיב שבו יבוצעו הפקודות למקרה של פקודה ללא נתיב מוגדר.
  • השורה השלישית קובעת אם לשלוח דואל בסיום הביצוע ולמי לשלוח אותו. ניתן לקבוע ”” (מחרוזת ריקה) כדי לא לשלוח דואל כלל.
  • השורה הרביעית משמשת לקביעת הנתיב ממנו יבוצעו הפקודות.

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

minute hour day month dayofweek command
  • הפרמטר הראשון קובע את הדקה שבה תבוצע הפקודה והוא יכול להיות כל מספר בטווח 0-59.
  • הפרמטר השני קובע את השעה שבה תבוצע הפקודה והוא יכול להיות כל מספר בטווח 0-23.
  • הפרמטר השלישי קובע את היום בחודש והוא יכול להיות כל מספר בטווח 1-31. שים לב כי אם קבעת גם חודש לביצוע, יש לשים לב שערך זה צריך להיות מתאים (לא לקבוע 31 באפריל לדוגמה כיוון שאין יום כזה).
  • הפרמטר הרביעי קובע את החודש והוא יכול להיות מספר בטווח 1-12.
  • הפרמטר החמישי קובע יום בשבוע והוא צריך להיות בטווח 0-7 כאשר 0 וגם 7 מייצגים את יום ראשון.

הערה חשובה: לפרמטרים 4,5 ניתן לתת ערכים אלפאנומריים כגון sun,mon,feb,mar וכך למנוע בילבול מיותר בפרמטר החמישי. (ברור יותר ש- sun מייצג את יום ראשון מאשר 0).

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

סימן סלאש הפוך / מייצג ערך לדילוג קבוע: \

  • jan-sep/2 מגדיר כל חודש שני מתחילת השנה ועד ספטמבר (פברואר, אפריל,יוני,אוגוסט,ספטמבר).
  • 3/* בשדה השני מגדיר פעולה להתבצע כל שלוש שעות.
  • הפרמטר השישי הוא פקודה חוקית במעטפת או שם שלך סקריפט לביצוע, כולל הנתיב המלא.

במערכות Redhat לא נהוג להוסיף שורות לקובץ זה ובמקום זאת יש להוסיף קובץ במבנה זהה לזה לתוך ספריית etc/crond.d/ אך צריך להשמיט את חלקו הראשון של הקובץ העוסק בהגדרת השרות.
root יכול להוסיף כל קובץ לסיפרייה זו והוא יבוצע במסגרת התזמון שהוגדר. המערכת בודקת פעם בדקה את השינויים בספרייה זו ומתעדכנת בהתאם.

משתמשים שאינם root צריכים להשתמש בתוכנית העזר crontab על מנת ליצור משימות משלהם. לכל משתמש יש קובץ משימות משלו והפקודות בו מבוצעות תחת שם המשתמש שלו.
קבצי המשתמשים מאוחסנים ב- var/spoll/cron/ ואסור לשנותם באופן ידני אלא להשתמש בתוכנית העזר crontab עם המתג e- .
תוכנית עזר זו פותחת את הקובץ לעריכה בעורך שהוגדר ע”י משתני הסביבה.

דוגמאות

כאמור, כל משתמש יכול להוסיף משימה שתרוץ תחת שם המשתמש שלו ע”י שימוש בתוכנית העזר crontab עם המתג e- .

דוגמאות אחדות המבהירות את התזמונים:

  • לביצוע עדכון של קבצי ה- DB של מערכת הקבצים ע”י updatedb דרושה לנו הרשאת root.

מתוך ה- shell של root נוכל לכתוב crontab -e ולהוסיף את השורה הבאה:

15 19 * * * updatedb

זה יבצע את updatedb בכל יום בשעה 19:15

  • משתמש הרוצה פעם בחודש לגבות את כל עבודתו לספרייה אחרת יכנס עם crontab -e ויוסיף את השורה הבאה:
5 8 1 * * cp ~/* /mybackupdirectory/

כך תופעל הפקודה cp ~/* /mybackupdirectory בכל פעם שהתאריך יהיה 1 בחודש, בכל חודש בשעה 8:05 לפנות בוקר.

  • על מנת לבצע פעולה מסויימת פעם בשעתיים נוסיף שורה כזו:
0 */2 * * * command

הפעולה המצויינת ע”י command תבוצע פעם בשעתיים, בתחילת השעה (0 דקות בשעון המערכת).

  • על מנת לבצע פעולה מסויימת פעם בשלוש שעות אך רק בשעות הלילה נוסיף שורה זו:
30 20-8/3 * * * command

הפקודה command תבוצע בכל פעם ששעון המערכת יראה 30 דקות והשעה תהייה בין שמונה בערב לשמונה לפנות בוקר, בכל שעה שלישית.

  • כדי לבצע פקודה פעם בשנה, בתאריך קבוע:
15 16 7 5 * command

בכל פעם שהתאריך יהיה השביעי במאי, והשעה תהייה 16:15 תבוצע הפקודה command.

  • כדי לבצע פקודה בכל שעה עגולה בימי שישי ה-13 נוסיף:
0 * 13 * fri command
  • כדי לבצע פקודה בכל דקה:

* * * * * command

כאמור, command יכול להיות סקריפט או פקודה בודדת.

ביצוע משימות מתוזמנות קבועות במערכת

במערכת Redhat הוספה תכונה חביבה בשם run-parts המבצעת את כל הסקריפטים הנמצאים בספרייה מסויימת.
כברירת מחדל, כפי שניתן לראות בקובץ etc/crontab/ מוגדרות ארבע סיפריות שהסקריפטים בהן מבוצעים פעם בשעה, פעם ביום, פעם בשבוע ופעם בחודש. הסיפריות הן:

etc/cron.daily/ etc/cron.hourly/ etc/cron.weekly/

etc/cron.monthly/

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

בקרת גישה לביצוע משימות

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

רשימות אלו מאוחסנות בקבצים:

/etc/cron.allow
/etc/cron.deny

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

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

anacron

תזמון משימות ע"י anacron

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

השרות מותקן מתוך חבילת anacron ובמערכות Redhat הוא מותקן כברירת מחדל אך לא מופעל. ע”מ לראות אם השרות מותקן:

[root@MySystem root]# rpm -q anacron

במידה ואינו מותקן יש להתקינו בעזרת rpm. ע”מ לראות אם השרות מופעל:

[root@MySystem root]# service anacron status

ע”מ להפעיל את השרות:

[root@MySystem root]# service anacron start

הקובץ הראשי של anacron הוא etc/anacrontab/ והוא משמש להגדרת המשימות שיבוצעו.

מבנה שורה בקובץ זה הוא:

period delay job-identifier command
  • period מציין את התדירות (בימים) שבהם יש לבצע את הפקודה.
  • delay מציין את זמן ההשהיה (בדקות).
  • job-identifier מציין את הטקסט שיופיע ברישומים. יכול להכיל כל ביטוי מלבד רווחים ולוכסנים (סלאשים).
  • command היא הפקודה לביצוע (פקודה בודדת או סקריפט).

anacron בודק אם הפקודה בוצעה בתקופת הזמן שהוגדרה ע”י period ואם לא, הוא ממתין delay דקות ומבצע אותה.

דוגמה לקובץ ברירת המחדל של anacron:

# /etc/anacrontab: configuration file for anacron

# See anacron(8) and anacrontab(5) for details.

SHELL=/bin/sh
PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin

# These entries are useful for a Red Hat Linux system.
1 5 cron.daily run-parts /etc/cron.daily
7 10 cron.weekly run-parts /etc/cron.weekly
30 15 cron.monthly run-parts /etc/cron.monthly

ניתן להבחין כי המשימות של anacron לפי הקובץ הזה מאפשרות להריץ את הסקריפטים הקבועים מראש אך בניגוד ל- crontab, במידה והם לא הורצו בזמן הנדרש, הם יורצו מייד. בסיום הביצוע של כל משימה יתווסף קובץ בשם שהוגדר ע”י job-identifier לספריית var/spool/anacron/ ובו הזמן (תאריך בלבד, ללא שעה) שבו התבצעה הפעולה וכך יכולה מערכת ה- anacron לוודא את הביצוע.

cron.hourly אינו מבוצע ע”י anacron כיוון שזו אינה בודקת ביצוע במרווחים של דקות או שעות אלא רק במרווחים של ימים.

at

שימוש ב- at

מערכת ה- at מבצעת פקודות באופן חד פעמי, בזמנים הנקבעים מראש.

השרות מותקן מתוך חבילת at ובמערכות Redhat הוא מותקן ומופעל כברירת מחדל. ע”מ לראות אם השרות מותקן:

[root@MySystem root]# rpm -q at

במידה ואינו מותקן יש להתקינו בעזרת rpm.

ע”מ לראות אם השרות מופעל:

[root@MySystem root]# service atd status

ע”מ להפעיל את השרות:

[root@MySystem root]# service atd start

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

תזמון משימה נעשה ע”י הקשת

[root@MySystem root]# at TIME

האפשרויות של TIME הן:

  • HH:MM - פורמט סטנדרטי של קביעת זמן. המשימה המתוזמנת תהייה בפעם הראשונה שבה שעון המערכת יעמוד על זמן זה כלומר ניתן לקבוע זמן רק בטווח של 24 השעות הקרובות.
  • MMDDYY - פורמט של תאריך לביצוע. המשימה המתוזמנת תתבצע בדקה הראשונה של התאריך הנתון.
  • midnight - בדיוק בחצות.
  • noon - בחצות היום כלומר בשעה 12 בצהריים.
  • teatime - בשעה 4 אחה”צ.
  • now + 5 weeks - בשעה הנוכחית בעוד חמישה שבועות
  • now + 2 days - בשעה הנוכחית בעוד יומיים
  • now + 3 hours - בעוד שלוש שעות
  • now + 27 minutes - בעוד 27 דקות

לאחר הקשת הפקודה יתקבל סמן המורה להקיש את רצף הפקודות לביצוע. שים לב כי ניתן להקליד מספר פקודות שיבוצעו בזו אחר זו או אפילו מספר סקריפטים שיבוצעו בזה אחר זה.
מעבר בין שורה לשורה נעשה ע”י הקשת Enter ולסיום נקיש Ctrl + D. המשימה תתוסף לרשימת המשימות לביצוע ותתחיל בשעה הנקובה.

במידה ולרצף הפקודות יהיה פלט כלשהו, הוא ישלח בדואל למשתמש שהפעיל את הפקודות.

תוספות לשימוש ב- at

על מנת לראות את רשימת המשימות המתוזמנות בעזרת at יש להקליד atq. הפלט יציג רשימה של פקודות והזמן שבו הן מתוכננות לביצוע.
במידה ומשתמש שאינו root מבצע atq הוא יכול לראות רק את המשימות שהוא קבע. רק root יכול לראות את כל המשימות המתוזמנות.

אפשרות נוספותאשר ניתן לבצע:

at TIME -f filename

ואז רשימת הפקודות לביצוע ע”י at תלקח מתוך הקובץ שצויין.

  • המתג m- גורם לשליחת דואל למשתמש מייד עם סיום הביצוע.
  • המתג v- יגרום ל- at להציג את הזמן שבו תבוצע הפקודה מייד עם סיום העריכה.
batch

ניתן לתזמן משימה כך שהיא תבוצע בזמן שבו עומס המערכת הוא מתחת ל- 0.8 .

פקודת batch אינה מקבלת ארגומנטים של זמן אלא רק את הארגומנטים של משלוח דואל, קריאה מקובץ והצגת הזמן (בדיוק כמו at) ולאחר הקשתה היא תתנהג כמו פקודת at בדיוק אך זמן ביצוע הפקודות יהיה הזמן הקרוב ביותר שבו המערכת לא תהייה עמוסה מעל ל- 0.8 .

בקרת גישה לביצוע משימות at

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

/etc/at.allow
/etc/at.deny

בתוך הקובץ נרשום את שמות המשתמשים כאשר כל שם בשורה נפרדת, ללא רווחים מיותרים בתוך הקובץ. רשימת השמות בקובץ at.allow מגדירה את הרשימה של המשתמשים שלהם מותר לערוך רשימת משימות מתוזמנות. במקרה שקובץ זה קיים, המערכת מתעלמת מקיומו של קובץ at.deny .

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

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

מדריכים/מבוא_ל_cron_ו-anacron.txt · שונה לאחרונה ב: 2008/06/19 18:34 (עריכה חיצונית)
chimeric.de = chi`s home Creative Commons License Valid CSS Driven by DokuWiki do yourself a favour and use a real browser - get firefox!! Recent changes RSS feed Valid XHTML 1.0