תחי ישראל - אין לנו ארץ אחרת

תחי ישראל -אין לנו ארץ אחרת

תן ל-bash לעבוד בשבילך - אוטומציה של מטלות מייגעות באמצעות קוד bash

מחבר:
בתאריך:

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

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

צעד 1: הבניית האפליקציה

את מבנה התיקיות של האפליקציה ניצור באמצעות הטרמינל בתוך התיקיות:

$ mkdir automated_tasks/sys_monitor/

אל תוך התיקייה הפנימית `sys_monitor` נוסיף את קובץ הסקריפט:

$ touch script.sh

נהפוך את הסקריפט לבר ביצוע:

$ chmod +x script.sh

 

צעד 2: סקריפט פשוט לבדיקת צריכת משאבי מערכת

בתוך הסקריפט נוסף את התוכן:

#!/bin/bash

APP_DIR="$HOME/automated_tasks/sys_monitor"
LOG_FILE="$APP_DIR/script.log"
ICON="$APP_DIR/icon.png"
  • ערך הקבוע `APP_DIR` מציין את מיקום תיקיית האפליקציה במערכת הקבצים
  • את קובץ הלוג הסקריפט ייצר בהמשך
  • יש להוסיף לתיקייה האפליקציה קובץ תמונה `icon.png` אשר יוצג במסגרת הנוטיפיקציה

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

CPU_THRESHOLD=90
MEMORY_THRESHOLD=80
DISK_THRESHOLD=10

נוסיף לסקריפט ה-bash פונקציה שתרשום לטרמינל את מצב משאבי המערכת:

monitor() {
   local cpu_usage=$(top -bn1 | grep "Cpu(s)" | sed "s/.*, *\([0-9.]*\)%* id.*/\1/")
   local cpu_usage_int=${cpu_usage%.*}  # Convert to integer

   local memory_usage=$(free | grep Mem | awk '{print $3/$2 * 100.0}')
   local memory_usage_int=${memory_usage%.*}  # Convert to integer

   local disk_usage=$(df / | grep '/' | awk '{print $5}' | sed 's/%//')
   local disk_usage_int=${disk_usage%.*}  # Convert to integer


   if [ "$cpu_usage_int" -gt "$CPU_THRESHOLD" ]; then
       echo "High CPU Usage - CPU usage is $cpu_usage% (threshold: $CPU_THRESHOLD%). - critical"
   else
       echo "CPU Usage $cpu_usage% - normal"
   fi

   if [ "$memory_usage_int" -gt "$MEMORY_THRESHOLD" ]; then
       echo "High Memory Usage - Memory usage is $memory_usage% (threshold: $MEMORY_THRESHOLD%). - critical"
   else
       echo "Memory Usage - $memory_usage% - normal"
   fi

   # Check disk usage
   if [ "$disk_usage_int" -lt "$DISK_THRESHOLD" ]; then
       echo "Low Disk Space - Disk space is $disk_usage% (threshold: $DISK_THRESHOLD%). - critical"
   else
       echo "Disk Space - $disk_usage% - normal"
   fi
}
  • מיצוי המידע מתוך הלוגים נעשה באמצעות הפקודות awk, sedו-grep.

בסוף הסקריפט, נוסיף קריאה לפונקציה:

# Call the function
monitor

כך נראה הסקריפט בשלב זה:

#!/bin/bash

APP_DIR="$HOME/automated_tasks/sys_monitor"
LOG_FILE="$APP_DIR/sys_monitor.log"
ICON="$APP_DIR/icon.png"

CPU_THRESHOLD=90
MEMORY_THRESHOLD=80
DISK_THRESHOLD=10

monitor() {
   local cpu_usage=$(top -bn1 | grep "Cpu(s)" | sed "s/.*, *\([0-9.]*\)%* id.*/\1/")
   local cpu_usage_int=${cpu_usage%.*}  # Convert to integer

   local memory_usage=$(free | grep Mem | awk '{print $3/$2 * 100.0}')
   local memory_usage_int=${memory_usage%.*}  # Convert to integer

   local disk_usage=$(df / | grep '/' | awk '{print $5}' | sed 's/%//')
   local disk_usage_int=${disk_usage%.*}  # Convert to integer


   if [ "$cpu_usage_int" -gt "$CPU_THRESHOLD" ]; then
       echo "High CPU Usage - CPU usage is $cpu_usage% (threshold: $CPU_THRESHOLD%). - critical"
   else
       echo "CPU Usage $cpu_usage% - normal"
   fi

   if [ "$memory_usage_int" -gt "$MEMORY_THRESHOLD" ]; then
       echo "High Memory Usage - Memory usage is $memory_usage% (threshold: $MEMORY_THRESHOLD%). - critical"
   else
       echo "Memory Usage - $memory_usage% - normal"
   fi

   # Check disk usage
   if [ "$disk_usage_int" -lt "$DISK_THRESHOLD" ]; then
       echo "Low Disk Space - Disk space is $disk_usage% (threshold: $DISK_THRESHOLD%). - critical"
   else
       echo "Disk Space - $disk_usage% - normal"
   fi
}

# Call the function
monitor

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

$ ./script.sh

זה מה שאני קיבלתי כשהרצתי את הסקריפט:

joe:~/automated_tasks/sys_monitor$ ./script.sh
High CPU Usage - CPU usage is 100.0% (threshold: 90%). - critical
Memory Usage - 29.6908% - normal
Disk Space - 54% - normal
  • הסקריפט מציג את השימוש במשאבי המערכת בזמן הריצה של הסקריפט.

 

צעד 3: רישום ללוג

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

write_in_log() {
   local message="$1"
   local urgency="${2:-normal}"

   echo "$(date '+%Y-%m-%d %H:%M:%S') - $urgency - $message" >> "$LOG_FILE"
}
  • הפונקציה מקבלת שני פרמטרים: טקסט עם תיאור המצב, ומידת בהילות `urgency`, ומוסיפה רשומה ללוג הכוללת את המשתנים והתאריך.

נערוך את הפונקציה `monitor` לעיל על מנת שתקרא לפונקציה `write_in_log`:

monitor() {
  local cpu_usage=$(top -bn1 | grep "Cpu(s)" | sed "s/.*, *\([0-9.]*\)%* id.*/\1/")
  local cpu_usage_int=${cpu_usage%.*}  # Convert to integer


  local memory_usage=$(free | grep Mem | awk '{print $3/$2 * 100.0}')
  local memory_usage_int=${memory_usage%.*}  # Convert to integer


  local disk_usage=$(df / | grep '/' | awk '{print $5}' | sed 's/%//')
  local disk_usage_int=${disk_usage%.*}  # Convert to integer




  if [ "$cpu_usage_int" -gt "$CPU_THRESHOLD" ]; then
      write_in_log "High CPU Usage - CPU usage is $cpu_usage% (threshold: $CPU_THRESHOLD%)." "critical"
  else
      write_in_log "CPU Usage $cpu_usage%" "normal"
  fi


  if [ "$memory_usage_int" -gt "$MEMORY_THRESHOLD" ]; then
      write_in_log "High Memory Usage - Memory usage is $memory_usage% (threshold: $MEMORY_THRESHOLD%)." "critical"
  else
      write_in_log "Memory Usage - $memory_usage%" "normal"
  fi


  # Check disk usage
  if [ "$disk_usage_int" -lt "$DISK_THRESHOLD" ]; then
      write_in_log "Low Disk Space - Disk space is $disk_usage% (threshold: $DISK_THRESHOLD%)." "critical"
  else
      write_in_log "Disk Space - $disk_usage%" "normal"
  fi
}

הרצתי את הסקריפט לבדיקה, וזה מה שקיבלתי:

2024-05-09 18:43:09 - normal - CPU Usage 76.9%
2024-05-09 18:43:09 - normal - Memory Usage - 30.4299%
2024-05-09 18:43:09 - normal - Disk Space - 54%

 

צעד 4: נוטיפיקציות למשתמש

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

נוסיף פונקציה `send_notification` להצגת הנוטיפיקציות:

send_notification() {
   local title="$1"
   local message="$2"
   local urgency="${3:-normal}"

   local timeout=5000  # Default timeout for normal urgency

   if [ "$urgency" = "critical" ]; then
       timeout=0  # No timeout for critical urgency
   fi

   # Set environment variables
   export DISPLAY=:0
   export DBUS_SESSION_BUS_ADDRESS=unix:path=/run/user/1000/bus
   
   # When it works it writes the id into the log
   gdbus call --session \
           --dest org.freedesktop.Notifications \
           --object-path /org/freedesktop/Notifications \
           --method org.freedesktop.Notifications.Notify \
           "$APP_NAME" \
           0 \
           "$ICON" \
           "$title" \
           "$message" \
           [] \
           {} \
           $timeout \
           >> "$LOG_FILE" 2>&1
}
  • הפונקציה מקבלת 3 מחרוזות קלט: כותרת הנוטיפיקציה, גוף, ומידת בהילות `urgency`
  • ערך ה-timeout של הצגת הנוטיפיקציה הוא 5 שניות אבל אם הבהילות מוגדרת "critical" אז ה-timeout יהיה 0 מה שאומר שהיא תמשיך להיות מוצגת עד שהמשתמש ינקה את התצוגה
  • משתני הסביבה עוזרים מאוד להצגה של הנוטיפיקציות כי הם מגדירים את הסביבה של המשתמש הנוכחי כזו שבה יש להציג את הנוטיפיקציות. אם אינך יודע מה ערכם של משתני הסביבה אצלך אז תעשה להם echo בטרמינל ותעדכן את הערך שתקבל (במחשבי דסקטופ עם משתמש יחיד סביר שתקבל את אותם ערכים כמוני).
  • השליחה עצמה נעשית באמצעות gbus שהוא ממשק נוח יותר מאשר D-Bus וגם רובסטי יותר מתוכנות שליחה אחרות אותם ניסיתי.
  • שגיאות והצלחות ירשמו בלוג.

 

צעד 5: משלוח מייל

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

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

send_email() {
    local recipient="$1"
    local subject="$2"
    local body="$3"

    local CRLF=$'\r\n'
    local email_data="From: $FROM_NAME <$FROM_ADDRESS>${CRLF}To: $recipient${CRLF}Subject: $subject${CRLF}${CRLF}$body"

    local result=$(curl --url "smtp://$SMTP_SERVER:$SMTP_PORT" \
                        --ssl-reqd \
                        --mail-from "$FROM_ADDRESS" \
                        --mail-rcpt "$recipient" \
                        --user "$SMTP_USERNAME:$SMTP_PASSWORD" \
                        -T <(echo -e "$email_data") 2>&1)

    local curl_exit_code=$?

    if [ $curl_exit_code -ne 0 ]; then
        echo "$(date '+%Y-%m-%d %H:%M:%S') - Failed to send email to $recipient: Curl error $curl_exit_code" >> "$LOG_FILE"
        echo "$result" >> "$LOG_FILE"
    else
        echo "$(date '+%Y-%m-%d %H:%M:%S') - Email sent to $recipient: $email_data" >> "$LOG_FILE"
    fi
}

נוסיף מעל לפונקציה את הקבוע שאומר לאיזה כתובת צריך המייל להשלח:

NOTIFY_EMAIL="admin_name@gmail.com"
  • נא להחליף עם כתובת המייל שלך.

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

את הקבועים של השליחה שמתי בקובץ נפרד שמחזיק את פרטי שירות המיילים ונמצא אצלי בתיקיית הבית בתוך קובץ קונפיגורציה נסתר (השם מתחיל בנקודה): `.email_config`

נוסיף את הקובץ לתיקיית הבית של המשתמש (או היכן שתרצה), ובתוכו יהיו פרטי משלוח המיילים, כולל:

SMTP_SERVER=""
SMTP_PORT=""
SMTP_USERNAME=""
SMTP_PASSWORD=""
FROM_NAME=""
FROM_ADDRESS=""

נייבא את קובץ הקונפיגורציה בראש סקריפט הבאש כדי שנוכל להשתמש בו למשלוח המיילים:

source "$HOME/.email_config"

 

צעד 6: קריאה לכל הפונקציות שהוספנו מפונקציה ייעודית

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

communicate() {
   local title="$1"
   local message="$2"
   local urgency="$3"

   write_in_log "$title - $message" "$urgency"

   echo "$title - $message - $urgency"

   if [[ "$urgency" == "critical" ]]; then
       send_notification "$title" "$message" "$urgency"
       send_email "$NOTIFY_EMAIL" "$urgency!!! $title" "$(date '+%Y-%m-%d %H:%M:%S') - $message"
   fi
}
  • הפונקציה מקבלת את הפרמטרים `title`, `message` ו-`urgency` , עושה להם echo, קוראת לפונקציה לרישום ללוג ואם מידת ה-`urgency` היא "critical" היא קוראת בנוסף לפונקציה `send_notification` ולפונקציה ששולחת את המייל.

נערוך את הפונקציה `monitor` כדי שתתקשר עם הפונקציה `communicate` במקום עם כל אחת מהפונקציות בנפרד:

monitor() {
   local cpu_usage=$(top -bn1 | grep "Cpu(s)" | sed "s/.*, *\([0-9.]*\)%* id.*/\1/")
   local cpu_usage_int=${cpu_usage%.*}  # Convert to integer

   local memory_usage=$(free | grep Mem | awk '{print $3/$2 * 100.0}')
   local memory_usage_int=${memory_usage%.*}  # Convert to integer

   local disk_usage=$(df / | grep '/' | awk '{print $5}' | sed 's/%//')
   local disk_usage_int=${disk_usage%.*}  # Convert to integer


   if [ "$cpu_usage_int" -gt "$CPU_THRESHOLD" ]; then
       communicate "High CPU Usage" "CPU usage is $cpu_usage% (threshold: $CPU_THRESHOLD%)." "critical"
   else
       communicate "CPU Usage" "$cpu_usage%" "normal"
   fi

   if [ "$memory_usage_int" -gt "$MEMORY_THRESHOLD" ]; then
       communicate "High Memory Usage" "Memory usage is $memory_usage% (threshold: $MEMORY_THRESHOLD%)." "critical"
   else
       communicate "Memory Usage" "$memory_usage%" "normal"
   fi

   # Check disk usage
   if [ "$disk_usage_int" -lt "$DISK_THRESHOLD" ]; then
       communicate "Low Disk Space" "Disk space is $disk_usage% (threshold: $DISK_THRESHOLD%)." "critical"
   else
       communicate "Disk Space" "$disk_usage%" "normal"
   fi
}

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

communicate "Hello" "Sys monitor is up and running" "critical"

כך נראית הנוטיפיקציה אצלי על המערכת:

the notification that the app created when run

 

צעד 7: הרצת הסקריפט מדי פרק זמן

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

# Run monitor periodically
while true; do
    monitor
    sleep 60
done

 

צעד 8: מניעה של הרצת הסקריפט יותר מפעם אחת

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

בראש הסקריפט נוסיף קבוע עם שם הקובץ הזמני:

LOCK_DIR="/tmp/sys_monitor_lock"

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

# Prevent the script from re-running
if mkdir "$LOCK_DIR" 2>/dev/null; then
   communicate "Hello" "Sys monitor is up and running" "critical"

   # Run monitor periodically
   while true; do
       monitor
       sleep 60
   done

   # Cleanup on exit
   rmdir "$LOCK_DIR"
   exit 0
else
   communicate "Exiting" "Script is already running. Exiting." "normal"
   exit 1
fi

 

כך נראה הסקריפט המלא:

#!/bin/bash

source "$HOME/.email_config"

APP_DIR="$HOME/automated_tasks/sys_monitor"
LOG_FILE="$APP_DIR/script.log"
ICON="$APP_DIR/icon.png"

LOCK_DIR="/tmp/sys_monitor_lock"

NOTIFY_EMAIL="your_email@gmail.com"

CPU_THRESHOLD=90
MEMORY_THRESHOLD=80
DISK_THRESHOLD=10

write_in_log() {
    local message="$1"
    local urgency="${2:-normal}"

    echo "$(date '+%Y-%m-%d %H:%M:%S') - $urgency - $message" >> "$LOG_FILE"
}

send_email() {
    local recipient="$1"
    local subject="$2"
    local body="$3"

    local CRLF=$'\r\n'
    local email_data="From: $FROM_NAME <$FROM_ADDRESS>${CRLF}To: $recipient${CRLF}Subject: $subject${CRLF}${CRLF}$body"

    local result=$(curl --url "smtp://$SMTP_SERVER:$SMTP_PORT" \
                        --ssl-reqd \
                        --mail-from "$FROM_ADDRESS" \
                        --mail-rcpt "$recipient" \
                        --user "$SMTP_USERNAME:$SMTP_PASSWORD" \
                        -T <(echo -e "$email_data") 2>&1)

    local curl_exit_code=$?

    if [ $curl_exit_code -ne 0 ]; then
        echo "$(date '+%Y-%m-%d %H:%M:%S') - Failed to send email to $recipient: Curl error $curl_exit_code" >> "$LOG_FILE"
        echo "$result" >> "$LOG_FILE"
    else
        echo "$(date '+%Y-%m-%d %H:%M:%S') - Email sent to $recipient: $email_data" >> "$LOG_FILE"
    fi
}

send_notification() {
    local title="$1"
    local message="$2"
    local urgency="${3:-normal}"
    
    local timeout=5000  # Default timeout for normal urgency

    if [ "$urgency" = "critical" ]; then
        timeout=0  # No timeout for critical urgency
    fi

    # Set environment variables
    export DISPLAY=:0
    export DBUS_SESSION_BUS_ADDRESS=unix:path=/run/user/1000/bus
    
    # When it works it writes the id into the log
    gdbus call --session \
           --dest org.freedesktop.Notifications \
           --object-path /org/freedesktop/Notifications \
           --method org.freedesktop.Notifications.Notify \
           "$APP_NAME" \
           0 \
           "$ICON" \
           "$title" \
           "$message" \
           [] \
           {} \
           $timeout \
           >> "$LOG_FILE" 2>&1
}

communicate() {
    local title="$1"
    local message="$2"
    local urgency="$3"

    write_in_log "$title - $message" "$urgency"

    echo "$title - $message - $urgency"

    if [[ "$urgency" == "critical" ]]; then
        send_notification "$title" "$message" "$urgency"
        send_email "$NOTIFY_EMAIL" "$urgency!!! $title" "$(date '+%Y-%m-%d %H:%M:%S') - $message"
    fi
}

monitor() {
    local cpu_usage=$(top -bn1 | grep "Cpu(s)" | sed "s/.*, *\([0-9.]*\)%* id.*/\1/")
    local cpu_usage_int=${cpu_usage%.*}  # Convert to integer

    local memory_usage=$(free | grep Mem | awk '{print $3/$2 * 100.0}')
    local memory_usage_int=${memory_usage%.*}  # Convert to integer

    local disk_usage=$(df / | grep '/' | awk '{print $5}' | sed 's/%//')
    local disk_usage_int=${disk_usage%.*}  # Convert to integer


    if [ "$cpu_usage_int" -gt "$CPU_THRESHOLD" ]; then
        communicate "High CPU Usage" "CPU usage is $cpu_usage% (threshold: $CPU_THRESHOLD%)." "critical"
    else
        communicate "CPU Usage" "$cpu_usage%" "normal"
    fi

    if [ "$memory_usage_int" -gt "$MEMORY_THRESHOLD" ]; then
        communicate "High Memory Usage" "Memory usage is $memory_usage% (threshold: $MEMORY_THRESHOLD%)." "critical"
    else
        communicate "Memory Usage" "$memory_usage%" "normal"
    fi

    # Check disk usage
    if [ "$disk_usage_int" -lt "$DISK_THRESHOLD" ]; then
        communicate "Low Disk Space" "Disk space is $disk_usage% (threshold: $DISK_THRESHOLD%)." "critical"
    else
        communicate "Disk Space" "$disk_usage%" "normal"
    fi
}

# Prevent the script from re-running
if mkdir "$LOCK_DIR" 2>/dev/null; then
    communicate "Hello" "Sys monitor is up and running" "critical"

    # Run monitor periodically
    while true; do
        monitor
        sleep 60
    done

    # Cleanup on exit
    rmdir "$LOCK_DIR"
    exit 0
else
    communicate "Exiting" "Script is already running. Exiting." "normal"
    exit 1
fi

 

צעד 9: הרצה אוטומטית של האפליקציה

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

לדוגמה:

@reboot sleep 180 && /bin/bash -l -c /your_user/automated_tasks/sys_monitor/script.sh
  • הפקודה מריצה את הסקריפט 3 דקות אחרי אתחול המחשב ומעבירה את משתני הסביבה לסקריפט.

 

מדריכים נוספים בסדרת הלינוקס

סקריפט ראשון בשפת bash - שלום עולם כמובן!

מדריך Awk - פקודה של Bash שהיא גם (סוג של) שפת תכנות

מדריך sed לעריכת טקסט שורה אחת בכל פעם

 

לכל המדריכים בסדרת הלינוקס

 

אהבתם? לא אהבתם? דרגו!

0 הצבעות, ממוצע 0 מתוך 5 כוכבים

 

 

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

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

שימו לב! הסקריפטים במדריכים מיועדים למטרות לימוד בלבד. כשאתם עובדים על הפרויקטים שלכם אתם צריכים להשתמש בספריות וסביבות פיתוח מוכחות, מהירות ובטוחות.

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

השימוש שלך באתר מהווה ראייה להסכמתך עם הכללים והתקנות שנוסחו בהסכם תנאי השימוש.

הוסף תגובה חדשה

 

 

ענה על השאלה הפשוטה הבאה כתנאי להוספת תגובה:

דג למים הוא כמו ציפור ל...?