צורות שונות למעבר שעון

| | | | | |
כל חצי שנה אילן שביט ואני כותבים על נושא מעבר השעון. למרות שברוב המקרים זה צריך להיות non issue, כלומר נושא שלגביו ברור מאוד מה עושים, תמיד יש שינויים הפתעות וכו'. הפעם אני רוצה להתייחס למספר הבדלים בין מערכות ההפעלה דומויות UNIX לגבי מעבר שעון, ועל מספר מקרי קצה שצריך להתייחס אליהם.

בלינוקס וסולאריס מדובר בקובץ בפורמט TZif (קובץ בינארי) בעוד שב-HP/UX מדובר בטבלת טקסט פשוטה. היתרון של טבלת הטקסט היא שניתן לבצע שינויים (עבור בדיקות) בקלות. אם רוצים לבדוק בסביבה יעודית כיצד תתנהג מערכת ההפעלה או האפליקציה, ניתן להכניס שורות מתאימות ולבצע הקפצת שעון בקלות. עבור שינויים בקובץ הבינארי צריך לעבוד טיפה יותר, אבל ניתן לקחת את קובץ החוקים של asia, לבצע את התיקונים ולקמפל מחדש עם zic (מגיע עם libc).

אגב, מהקובץ מקור ניתן לראות כי מאז מאז 97 יש תרומה של מידע על שינוי השעון מאת Ephraim Silverberg מהאוניברסיטה העברית בירושלים. החל משנת 2005, עם שינוי החוק (והכנסת מנגנון חישוב קבוע), חושבה הטבלה מחדש ע"י Paul Eggert (פרופסור מארה"ב) ונתרמה בחזרה למאגר. זהו בעצם הבסיס עבור מה שיש היום בלינוקס.

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

בחזרה לחלק הטכני - בלינוקס (נבדק ב-Debian/RHEL) אין שימוש במשתנה סביבה עבור אזור הזמן, והקובץ /etc/localtime הוא זה שמכתיב את אזור הזמן של המערכת. כאשר כדי לשנות אזור זמן מספיק להעתיק את הקובץ המתאים מתוך /usr/share/zoneinfo לתוך /etc/localtime. השינוי תקף מיידית מאחר וכל פקודה שצריכה את הזמן תקרא את הקובץ.

במערכות אחרות (Solaris, HP-UX) ישנו שימוש במשתנה TZ כדי לקבוע את הזמן של המערכת, כאשר כל תוכנה יודעת לפנות לקובץ המתאים כדי לקרוא את התוכן של קובץ אזור הזמן. החסרון הבולט של שיטה זאת היא שתהליכים שכבר בריצה עדיין מכילים ערך משלהם למשתנה TZ. כלומר, שינוי עבור כל התהליכים דורש אתחול של המערכת. ניתן כמובן להסתפק באתחול כל התהליכים שבריצה, אבל זה בדרך כלל דורש יותר עבודה מאשר אתחול של המחשב.

בלינוקס, השימוש ב-TZ מבוצע רק עבור משתמש שרוצה אזור זמן שונה מאשר ברירת המחדל של מערכת ההפעלה. ניתן לראות בעזרת strace שהפקודה date לא קוראת את הקובץ /etc/localtime כאשר המשתנה מוגדר אלא הולכת לקובץ המתאים בתוך /usr/share/zoneinfo. כך שלדעתי הפתרון של לינוקס הרבה יותר אלגנטי ומאפשר שינויים גלובליים בקלות.

אפשרויות לתצוגת תגובות

בחרו באפשרות התצוגה הרצויה, ולחצו על "שמור הגדרות".

ב- Java בחרו להיות עצמאיים ולשכפל את המנגנון

בזמנו כתבתי מאמר העוסק בבעייתיות מעבר השעון באפליקציות Java.
מופיעה גם השוואה בין המנגנון של לינוקס\יוניקס לאלה של - Java.
Java משתמשת באותו פורמט בינארי ש- zic יוצר.

מעניין, תודה....

מעניין, תודה.