סליחה מתי להתחיל ?

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

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

  • כאמור התחביר – קל מידי להתבלבל בתחביר ולגרום למשהו לקום בזמן לא נכון
  • קשה עד כמעט בלתי אפשרי לדבג בעיות באמצעותו
  • הוא לא יודע לתת מענה לזמנים פחות מדקה (אם צריך שכל 3 שניות נקבל את השינוי מהבורסה למשל, הוא לא מתאים עבורינו)
  • לא ניתן לבצע התנייה שפעולה מסויימת תפעל פעם ב5 דקות אבל רק אם פעולה אחרת הסתיימה (יש דרכים לעשות את זה, אבל cron לא תומך בזה, זה הכל חצוני)
  • לפעמים הסביבה שלנו (כלומר משתני הסביבה, נתיבים וכו') שונים לגמרי ב cron מאשר בשורת הפקודה ואנחנו מגלים שדברים לא עובדים

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

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

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

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

למשל בכלי אחד אפשר לעשות את הפעולה הבאה:

require 'stalker'
handler { |job| Stalker.enqueue(job) }

every 1.hour, 'apis.poll'
every 1.day,  'reports.email', :at => '00:00'

ואז מופעל השירות שיש לנו צורך בו כדוגמת apis.poll (זה שם הפעולה). במידת הצורך אפשר פיזית גם לתת block של קוד בנוסף. הלוגיקה עצמה, כאמור אבל צריכה להתיות במקום אחר, היות וכאן רק מאחסנים את שם הפעולה ומתי היא צריכה להתבצע.

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

וזה מה שיש לפינק פלויד להגיד בנושא.

5 מחשבות על “סליחה מתי להתחיל ?

  1. ik_5 מאת

    יש לך בלינוקס (גם בווינדוז את האמת) ושאר היוניקסים מתזמני משימות, כלומר בפרק זמן מסויים להריץ פקודה/תוכנה מסויימת.
    בגדול מאוד זה נקרא cron, בלינוקס זה בד"כ crontab.

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

  2. Tzafrir Cohen

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

    אם אתה רוצה להריץ משימה אחרי שמשימה אחרת התבצעה, אתה אולי צריך להשתמש ב־atd ולא ב־cron.

    אם אתה מצפה שמה שהרצת מעבודה מתוזמנת ירוץ עם הסביבה המקרית שיש לך כרגע ב־shell (לדוגמה: מסוף) אתה באמת חי באשליות. האשליה תתנפץ כשתיצור משימה עם סביבה קצת שונה.

  3. ik_5 מאת

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

    העניין לגבי ה shell הוא שעם cron קשה מאוד לדבג את המידע, מספיק עכשיו שמשתנה סביבה מסויים משוכתב בשביל שאפילו האפליקציה שלך לא תרוץ (אני משתמש למשל ב /usr/bin/env בשביל להרץ תוכנות כי הן יכולות לעבוד על עוד מערכות מבוססיות יוניקס שלא בהכרח שומרות באותו מיקום את המפרש שפה).

    כאן יש לי שליטה גבוהה יותר במה שקורה,

  4. meir

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

כתיבת תגובה

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

הלוגו של WordPress.com

אתה מגיב באמצעות חשבון WordPress.com שלך. לצאת מהמערכת / לשנות )

תמונת Twitter

אתה מגיב באמצעות חשבון Twitter שלך. לצאת מהמערכת / לשנות )

תמונת Facebook

אתה מגיב באמצעות חשבון Facebook שלך. לצאת מהמערכת / לשנות )

תמונת גוגל פלוס

אתה מגיב באמצעות חשבון Google+ שלך. לצאת מהמערכת / לשנות )

מתחבר ל-%s