סקריפט keep-alive
11 בינואר, 2006

נניח שיש מחשב שאתם רוצים שהוא יהיה מחובר 24/7. נניח שמסיבות חיצוניות כלשהן - בין אם מצד ה־ISP, מצד תשתית־התקשורת או מכל סיבה אחרת - החיבור מתנתק מדי־פעם, פעם בכמה ימים. נניח שאתם רוצים לפתור את הבעיה, או, אם לדייק, לעקוף אותה בלי לפתור אותה באמת. נניח שמותקנת אצלכם מערכת־הפעלה UNIX-like. נניח ש־bash ו־ping מותקנים.
פתרון אפשרי, ואפקטיבי, הוא לכתוב סקריפט קצר, שיבדוק כל פרק־זמן: אם אני offline, תתחבר; אם אני online, אל תעשה כלום. בנוסף, ניהול של log הוא לא רעיון רע: ככה אפשר לדעת מתי החיבור ירד.

איך עושים את זה? למעשה, זה ממש פשוט. נסתכל על התבנית הבאה:


#!/bin/bash
while [ true ]; do
 ping -c 1 someserver.net &> /dev/null
 if [ $? != 0 ]; then
  date >> ~/logfile
  echo -e "The connection is down. Connecting...\n" >> ~/logfile
  start_internet_connection
 else
  date >> ~/logfile
  echo -e "The connection is up.\n" >> ~/logfile
 fi
 sleep 1h
done

לא צריך להיות מתכנת־על כדי להבין מה התוכנה עושה.
זה די פשוט: השורה הראשונה מגדירה את הסקריפט כסקריפט של bash. אחר־כך, נפתחת לולאה אינסופית (ההנחה היא שאנחנו לא רוצים לנתק את החיבור, בכלל) שמסתיימת ב"done" בשורה האחרונה. את הלולאה אפשר להפסיק על־ידי ctrl+c. השורה הראשונה בתוך הלולאה עושה פינג של נסיון אחד לאיזשהו שרת שאמור להיות זמין תמיד (נאמר, לדוגמה, google.com או השרת של ה־ISP שלכם, נגיד cables.netvision.net.il אצל נטוויז'ן בכבלים). ה־output הולך ל־dev/null/, מה שיכול לגרום למחשבה שבעצם הפקודה הזו לא משפיעה בכלל. לא היא! ה־return code (הערך המספרי (int) שמחזירה הפונקציה הראשית של תוכנה מסויימת) של התוכנה האחרונה שהרצנו נשמר במשתנה ?$. הערך התקין, שמוחזר כשלא היו שום בעיות בתוכנה, הוא 0. בלינוקס, אבל אני מניח שברוב מערכות־ההפעלה דמויות־יוניקס, ping מחזיר ערך 0 אם הוא הצליח לשלוח/לקבל את הפינג; וערך אחר אם לא. לכן ה־program flow מתפצל על־פי הערך המוחזר. אם הפינג לא הצליח, מה שאומר שהתקשורת נפלה, הוא כותב ללוג (גרשיים משולשים כפולים גורמים להעברת ה־output של התוכנה לסוף של קובץ, כשאם הקובץ לא קיים, הוא נוצר), בצירוף תאריך, שהתקשורת נפלה ומפעיל את הפקודה שמחברת לרשת (זה, כמובן, תלוי באופן שבו אתם מתחברים לרשת. באופן החיבור הדיפולטיבי ל־adsl ב־Gentoo, נגיד, יהיה adsl-start). אם הפינג הצליח, רק נכתבת רשומה ללוג. אחרי זה, הסקריפט מחכה שעה (1h) עד לריצה הבאה של הלולאה.

מה שצריך לעשות זה לשמור את הסקריפט, עם השינויים הנצרכים, בקובץ, לתת לו הרשאות־הרצה (chmod +x filename), ולהריץ אותו כדי להתחבר לרשת או לשמור על התקשורת פועלת.

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

תגים