תיקון ליל שבועות
חלק מכם, שמנויים לקבלת פוסטים חדשים דרך המייל, שמו לב וודאי לבאג שהיה במערכת בחג שבועות האחרון. בימים רגילים המערכת מקפידה לא לשלוח אימייל בחגים, אבל הפעם ערב חג שבועות יצא ביום שבת וזה בלבל את כל המנגנונים.
1. מה קרה
המנגנון הרגיל של הפצת הפוסטים הוא בסך הכל סקריפט שמתעורר כל בוקר בשבע בבוקר ובתשע בערב בעזרת השורה הבאה ב crontab:
0 7,21 * * 0,1,2,3,4 /home/ynon/bin/cron/daily_blog.sh
ביום שישי הסקריפט מתעורר רק בשבע בבוקר כדי לא לשלוח מיילים בשבת:
0 7 * * 5 /home/ynon/bin/cron/daily_blog.sh
ובשבת הוא מתעורר רק בתשע בערב:
0 21 * * 6 /home/ynon/bin/cron/daily_blog.sh
ולמה ביום רגיל אנחנו מנסים פעמיים? כי חלק מהימים הרגילים הם חגים. בשביל לזהות חגים כתבתי את הסקריפט הקצר הבא שמשתמש ב hebcal:
evenings_ok=(
"Pesach I"
"Pesach VII"
"Shavuot I"
"Tish'a B'Av"
"Rosh Hashana II"
"Yom Kippur"
"Sukkot I"
"Shmini Atzeret"
)
no_emails=(
"Rosh Hashana"
)
for send_in_evening in "${evenings_ok[@]}"
do
# echo "^[0-9/]+ ${send_in_evening}"
if hebcal $(date +"%m %d %Y") | egrep -v "CH''M" | egrep "^[0-9/]+ ${send_in_evening}" >& /dev/null
then
if (( $(date +%"_H") < 20 ))
then
exit 1
fi
fi
done
for holiday in "${no_emails[@]}"
do
if hebcal $(date +"%m %d %Y") | egrep "^[0-9/]+ ${holiday}" >& /dev/null
then
exit 1
fi
done
הסקריפט מנסה לזהות אם אנחנו עכשיו באמצע חג באמצעות hebcal. הוא מפעיל hebcal, משתמש ברשימה של חגים שהוא מכיר, ואם hebcal מדפיס שאנחנו עכשיו באחד החגים האלה והשעות מתאימות הסקריפט יצא עם exit 1
.
אפשר להפעיל את הסקריפט מכל שפת תכנות או אפילו משורת הפקודה:
$ source holiday_protect.sh && echo Not a holiday
ואם אנחנו לא בחג נקבל את ההדפסה.
2. מה נשבר
בשבועות האחרון ערב חג יצא בדיוק ביום שבת - מה שאומר שבאותו יום לא רצינו לשלוח מייל גם בבוקר כי שבת, וגם בערב כי ערב חג. אבל ערבי חג לא קיבלו שום טיפול בסקריפט המקורי.
פה המקום לשאול - למה בעצם לא ראינו את התקלה הזאת קודם? למה המערכת לא שלחה קבוע מיילים בערבי חג? למה היה צריך לחכות דווקא לערב חג שיוצא בשבת?
התשובה היא שבאמת לא היה שום מנגנון שמדלג על שליחת אימייל בערב חג, אבל כן היה מנגנון ששולח את המייל בערב החג בשבע בבוקר. לכן כשהגיע תשע בערב באותו יום של ערב חג, המערכת רצתה לשלוח את הפוסט החדש במייל אבל פשוט לא היה לה למי. כולם כבר קיבלו את הפוסט בבוקר. (וכן אנחנו עכשיו רואים שאני גם זוכר למי שלחתי איזה אימייל כדי לא לשלוח פעמיים, אבל זה כבר מנגנון אחר).
3. התיקון
בחזרה לשבועות - באותו יום בגלל שערב חג יצא בשבת אז בבוקר לא נשלח המייל לאף אחד. המערכת התעוררה במוצאי שבת, גילתה שאין בעיה לשלוח, כי אף פעם לא בדקנו ערבי חג, ושלחה את הפוסט היומי להפתעתם של המנויים במייל.
אחד המופתעים, שמחה בונם חמניצקי, גם הציע עזרה ובנה גירסה מתוקנת לסקריפט שמזהה ערבי חג. אם במקרה אתם גם מחפשים פיתרון לזהות חגים ושבתות כדי לעצור בהם פעולות אוטומטיות אז הנה הסקריפט המתוקן:
evenings_ok=(
"Pesach I"
"Pesach VII"
"Shavuot I"
"Tish'a B'Av"
"Rosh Hashana II"
"Yom Kippur"
"Sukkot I"
"Shmini Atzeret"
)
no_emails=(
"Rosh Hashana"
)
no_emails_erev=(
"Erev Pesach"
"Erev Shavuot"
"Erev Rosh Hashana"
"Erev Sukkot"
"Erev Yom Kippur"
)
for send_in_evening in "${evenings_ok[@]}"
do
# echo "^[0-9/]+ ${send_in_evening}"
if hebcal $(date +"%m %d %Y") | egrep -v "CH''M" | egrep "^[0-9/]+ ${send_in_evening}" >& /dev/null
then
if (( $(date +%"_H") < 20 ))
then
exit 1
fi
fi
done
for holiday in "${no_emails[@]}"
do
if hebcal $(date +"%m %d %Y") | egrep "^[0-9/]+ ${holiday}" >& /dev/null
then
exit 1
fi
done
for erev_holiday in "${no_emails_erev[@]}"
do
if [hebcal $(date +"%m %d %Y") | egrep "^[0-9/]+ ${erev_holiday}" >& /dev/nul] && [$(date +"_H") > 19]
then
exit 1
fi
done
ואם הכל ילך כמו שצריך, בפעם הבאה שיהיה לנו ערב חג בשבת הפוסט המתאים יישלח במוצאי החג.