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

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

כתיבת סקריפט

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

להלן הסקריפט למערכות פדורה:

#!/bin/bash

dnf check-update > /home/nachmen/Desktop/dnf-update-logs/"$(date +'%d-%m-%y')"

אפרק לגורמים את הפקודה:

  1. הפקודה הראשונה היא בדיקת העדכונים, dnf check-update .
  2. פלט הפקודה ייכתב לקובץ חדש במיקום /home/nachmen/Desktop/dnf-update-logs/ .
  3. שם הקובץ יקבל את תאריך הביצוע, שהוא ביטוי של המשתנה "$(date +'%d-%m-%y')" .

ניתן לסקריפט הרשאות ריצה:

chmod +x dnf_updates.sh

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

כתיבת משימה מתוזמנת

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

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

נקליד בטרמינל את הפקודה הבאה:

crontab -e

תוכנת crontab מנהלת את המשימות המתזמנות של המערכת, והפרמטר e- מציין edit - עריכת המשימות.

יפתח בפנינו עורך הטקסט nano , ואם זו הפעם הראשונה שבה אנו יוצרים משימה מתוזמנת - הקובץ יהיה ריק.

נחליט שאנו רוצים להריץ בדיקת עדכונים בכל יום בשעה 11:45 לפני הצהריים, נוסיף שורה זו בקובץ:

45 11 * * * /home/nachmen/Scripts/dnf-updates.sh

להסביר את הצופן הזה, נקרא את הקובץ etc/crontab/:

# For details see man 4 crontabs

# Example of job definition:
# .---------------- minute (0 - 59)
# |  .------------- hour (0 - 23)
# |  |  .---------- day of month (1 - 31)
# |  |  |  .------- month (1 - 12) OR jan,feb,mar,apr ...
# |  |  |  |  .---- day of week (0 - 6) (Sunday=0 or 7) OR sun,mon,tue,wed,thu,fri,sat
# |  |  |  |  |
# *  *  *  *  * user-name  command to be executed

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

הביטוי של זמן הביצוע הוא באופן הבא:

  • הכוכבית הראשונה משמאל מציינת את הדקה בשעה - בין 0 ל- 59.
  • הכוכבית השנייה מציינת את השעה ביום - בין 0 ל- 23.
  • הכוכבית השלישית מציינת יום בחודש - בין 1 ל- 31.
  • הכוכבית הרביעית מציינת את החודש בשנה - בין 1 ל- 12.
  • הכוכבית החמישית מציינת את היום בשבוע - בין 0 ל- 6 כאשר 0 הוא יום ראשון, או כתיבת שם היום.

במקרה שלנו, אנו כתבנו בכוכבית השנייה 11, ובכוכבית הראשונה 45. המשמעות: בשעה 11, ודקה 45. ומכיוון שלא ציינו את היום בחודש, החודש, והיום בשבוע - המשימה תרוץ בכל יום ויום.

כדי לסמלץ את הנושא ניתן להיעזר באתר crontab.guru בו ניתן “לקבוע זמן” לביצוע המשימה, ולקבל פידבק מתי זה יקרה. הנה תמונה של האתר:

Crontab.guru

בשורה באמצע כותבים את התאריך והשעה, ומיד מופיע מתי תהיה הפעם הבאה שהמשימה תרוץ.

כעת, נכתוב את הנתיב והמיקום המדויק של הסקריפט שבודק עדכונים, במקרה שלנו הוא /home/nachmen/Scripts/dnf-updates.sh , ונשמור את הקובץ (ctrl + o, enter) ונצא מעורך הטקסט (ctrl + x).

במקרה שלנו אין חובה לציין את המשתמש שיריץ את המשימה.

לוודא שהמשימה אכן נכתבה ונשמרה נקליד את הפקודה:

crontab -l

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

45 11 * * * /home/nachmen/Scripts/dnf-update.sh

כעת מה שנשאר זה כל יום לקרוא את רשימת העדכונים אשר נכתבו בקובץ העדכונים היומי, ולהריץ את הפקודה:

sudo dnf upgrade

בהצלחה!