0Pricing
Linux Server Deployment & SSH Mastery · บทเรียน

การจัดการข้อผิดพลาดและการบันทึกในสคริปต์

นำการจัดการข้อผิดพลาดที่รัดกุมมาใช้ เปลี่ยนเส้นทางผลลัพธ์ของสคริปต์ และสร้างบันทึกที่มีความหมายเพื่อติดตามการทำงานของสคริปต์และแก้ไขปัญหา

การจัดการข้อผิดพลาดและการบันทึกในสคริปต์ เป็นบทเรียน Linux Server Deployment & SSH Mastery ฟรีบน CoddyKit นี่คือบทเรียนที่ 3 จากทั้งหมด 4 บทเรียน คุณสามารถอ่านบทเรียนทั้งหมดด้านล่างฟรี — จากนั้นลองปฏิบัติด้วยตัวคุณเองในเบราว์เซอร์พร้อมตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7 บทเรียนนี้เป็นส่วนหนึ่งของเส้นทางการเรียน Linux Server Deployment & SSH Mastery และความก้าวหน้าของคุณจะซิงค์ข้ามเว็บและแอป CoddyKit คอร์ส Linux Server Deployment & SSH Mastery มีบทเรียนทั้งหมด 4 บทเรียน

ทำให้สคริปต์ของคุณทำงานได้อย่างน่าเชื่อถือ

ลองจินตนาการว่าสคริปต์ของคุณกำลังทำงานบนเซิร์ฟเวอร์และกำลังจัดการงานสำคัญ หากมีบางอย่างผิดพลาด จะเกิดอะไรขึ้น

  • สคริปต์ล้มเหลวโดยไม่มีการแจ้งเตือนหรือไม่
  • สคริปต์ทิ้งความยุ่งเหยิงไว้เบื้องหลังหรือไม่
  • คุณทราบหรือไม่ว่า เมื่อใด และ เพราะเหตุใด สคริปต์จึงล้มเหลว

สคริปต์ที่มีความทนทานจะจัดการข้อผิดพลาดอย่างเหมาะสมและบันทึกข้อมูลอย่างชัดเจน บทเรียนนี้จะสอนวิธีการดังกล่าวให้คุณ

ทำความเข้าใจรหัสการออก

คำสั่งและสคริปต์ทุกชุดใน Linux จะส่งคืน รหัสการออก (หรือสถานะการออก) เมื่อทำงานเสร็จ ตัวเลขนี้จะบอกว่าการทำงานสำเร็จหรือล้มเหลว

  • 0: หมายถึงสำเร็จ ทุกอย่างทำงานได้เรียบร้อย
  • 1-255: หมายถึงล้มเหลว ตัวเลขที่เฉพาะเจาะจงอาจบ่งบอกประเภทของข้อผิดพลาด

มาดูการทำงานจริงกัน

#!/bin/bash
# This script demonstrates exit codes

echo "Attempting a successful command..."
ls /tmp
echo "Exit code for 'ls /tmp': $?"

echo

echo "Attempting a failing command..."
ls /nonexistent_directory
echo "Exit code for 'ls /nonexistent_directory': $?"

ตรวจสอบสถานะคำสั่ง

หลังจากคำสั่งใด ๆ ทำงานเสร็จ คุณสามารถตรวจสอบรหัสการออกได้โดยใช้ตัวแปรพิเศษ $? ซึ่งมีประโยชน์อย่างมากสำหรับการตัดสินใจในสคริปต์ของคุณ

คุณสามารถใช้คำสั่ง if เพื่อโต้ตอบกับผลสำเร็จหรือล้มเหลวได้

#!/bin/bash
# Check if a file exists before trying to read it

FILENAME="test_file.txt"
touch $FILENAME # Create it for success case

if [ -f "$FILENAME" ]; then
  echo "File '$FILENAME' exists. Processing..."
  # ... do something with the file ...
  rm $FILENAME # Clean up
else
  echo "Error: File '$FILENAME' not found!"
  exit 1
fi

echo "Script finished."

`set -e`: ออกจากการทำงานเมื่อเกิดข้อผิดพลาด

สำหรับสคริปต์แบบง่าย การตรวจสอบ $? ด้วยตนเองในทุกจุดอาจน่าเบื่อ คำสั่ง set -e จะเปลี่ยนพฤติกรรมของสคริปต์ดังนี้

  • หากคำสั่งใดส่งคืนสถานะที่ไม่ใช่ศูนย์ (ทำงานล้มเหลว) สคริปต์จะยุติการทำงานทันที
  • วิธีนี้จะป้องกันไม่ให้สคริปต์ทำงานต่อโดยมีข้อมูลที่อาจเสียหายหรืออยู่ในสถานะที่ไม่ถูกต้อง

ลองเรียกใช้สคริปต์นี้ หากคำสั่ง cp ล้มเหลว จะเกิดอะไรขึ้น

#!/bin/bash
set -e

echo "Starting important operations..."
mkdir my_temp_dir
cp /nonexistent_source my_temp_dir/target # This will fail

echo "This line will not be reached if cp fails."
rmdir my_temp_dir
echo "Script finished successfully."

ใช้ `trap` สำหรับการล้างข้อมูล

บางครั้งแม้สคริปต์จะล้มเหลว คุณก็ยังต้องดำเนินการล้างข้อมูล เช่น ลบไฟล์ชั่วคราว คำสั่ง trap ช่วยให้คุณดักจับสัญญาณ (เช่น การออกจากการทำงานหรือข้อผิดพลาด) แล้วเรียกใช้คำสั่งได้

  • EXIT: ทำงานเมื่อสคริปต์ออกจากการทำงาน ไม่ว่าจะสำเร็จหรือล้มเหลว
  • ERR: ทำงานเมื่อคำสั่งส่งคืนสถานะที่ไม่ใช่ศูนย์ (หากเปิดใช้งาน set -e)

ในตัวอย่างนี้ เรารับรองว่าไดเรกทอรีชั่วคราวจะถูกลบเสมอ

#!/bin/bash

TEMP_DIR="/tmp/my_script_temp_$(date +%s)"

function cleanup {
  echo "Cleaning up temporary directory: $TEMP_DIR"
  rm -rf "$TEMP_DIR"
}

trap cleanup EXIT

mkdir "$TEMP_DIR"
echo "Working in $TEMP_DIR..."
# Simulate some work, maybe it fails
# cp /nonexistent_file "$TEMP_DIR/" # Uncomment to test failure

echo "Script completed."

เปลี่ยนเส้นทางผลลัพธ์

เมื่อสคริปต์ทำงาน สคริปต์มักพิมพ์ข้อความออกมา ข้อความเหล่านี้มีอยู่สองประเภทหลัก

  • ผลลัพธ์มาตรฐาน (stdout): ข้อความทั่วไป (ตัวระบุไฟล์ 1)
  • ข้อผิดพลาดมาตรฐาน (stderr): ข้อความข้อผิดพลาด (ตัวระบุไฟล์ 2)

คุณสามารถเปลี่ยนเส้นทางกระแสข้อมูลเหล่านี้ไปยังไฟล์แทนการแสดงบนหน้าจอได้

  • command > file: เปลี่ยนเส้นทาง stdout ไปยัง file
  • command 2> file: เปลี่ยนเส้นทาง stderr ไปยัง file

มาบันทึกข้อความสำเร็จและข้อความข้อผิดพลาดแยกกัน

#!/bin/bash
# Redirect stdout to success.log and stderr to error.log

echo "This is a success message." > success.log
ls /nonexistent_path 2> error.log

echo "Check success.log and error.log files."
# To view them after running:
# cat success.log
# cat error.log

ส่งผลลัพธ์ทั้งหมดไปยังไฟล์เดียว

บ่อยครั้งการมีทั้งผลลัพธ์มาตรฐานและข้อผิดพลาดมาตรฐานอยู่ในไฟล์บันทึกเดียวกันจะช่วยให้ตรวจสอบได้ง่ายขึ้น วิธีการทำเช่นนี้มีอยู่สองสามวิธี

  • command > file 2>&1: เปลี่ยนเส้นทาง stdout ไปยัง file จากนั้นเปลี่ยนเส้นทาง stderr ไปยังตำแหน่งเดียวกับ stdout (คือไฟล์นั้น)
  • command &> file: รูปแบบไวยากรณ์ที่สั้นและทันสมัยกว่าสำหรับการทำงานแบบเดียวกัน

วิธีนี้เหมาะสำหรับสร้างบันทึกการทำงานของสคริปต์อย่างครบถ้วน

#!/bin/bash
# Redirect both stdout and stderr to a single log file

LOG_FILE="combined_script.log"

echo "Starting script..." &> "$LOG_FILE"
echo "This message goes to stdout." &>> "$LOG_FILE"
ls /nonexistent_dir 2>&1 | tee -a "$LOG_FILE"
echo "Script finished." &>> "$LOG_FILE"

echo "Check the '$LOG_FILE' file for all output."

เพิ่มการประทับเวลาให้บันทึก

เมื่อแก้ไขข้อผิดพลาด การทราบว่าเหตุการณ์เกิดขึ้น เมื่อใด เป็นสิ่งสำคัญอย่างยิ่ง การเพิ่มการประทับเวลาให้ข้อความในบันทึกจะทำให้บันทึกมีประโยชน์มากขึ้น

คุณสามารถเพิ่มวันที่และเวลาปัจจุบันไว้ข้างหน้ารายการบันทึกแต่ละรายการโดยใช้คำสั่ง date วิธีนี้ช่วยติดตามเหตุการณ์ตามลำดับเวลาได้

#!/bin/bash

LOG_FILE="timestamped_script.log"

function log_message {
  echo "$(date +%Y-%m-%d_%H:%M:%S) - $1" &>> "$LOG_FILE"
}

log_message "Script started."
sleep 1
log_message "Performing task A..."
# Simulate an error
ls /no_such_place || log_message "Error: Command failed."
sleep 1
log_message "Script finished."

echo "Check '$LOG_FILE' for timestamped entries."

ส่งไปยังบันทึกของระบบด้วย `logger`

สำหรับเหตุการณ์สำคัญ คุณอาจต้องการส่งข้อความไปยังระบบบันทึกของระบบโดยตรง (syslog) คำสั่ง logger ทำหน้าที่นี้โดยเฉพาะ

  • บันทึกของระบบมักได้รับการจัดการโดยเครื่องมืออย่าง journalctl (ในระบบที่ใช้ systemd)
  • วิธีนี้จะรวมข้อความสำคัญจากสคริปต์ของคุณไว้กับเหตุการณ์อื่น ๆ ของระบบ
  • มีประโยชน์สำหรับข้อผิดพลาดร้ายแรงหรือบันทึกการตรวจสอบ

คุณสามารถค้นหาข้อความที่ส่งด้วย logger ได้โดยใช้ journalctl -f หรือ tail -f /var/log/syslog (ขึ้นอยู่กับระบบของคุณ)

#!/bin/bash
# Send a message to system logs

SCRIPT_NAME="MyBackupScript"

logger -t "$SCRIPT_NAME" "Starting daily backup operation."

# Simulate a task
sleep 2
if [ $(($RANDOM % 2)) -eq 0 ]; then
  logger -t "$SCRIPT_NAME" -p user.info "Backup successful."
else
  logger -t "$SCRIPT_NAME" -p user.err "Backup failed: Disk full."
fi

echo "Messages sent to system logs. Check with 'journalctl -t $SCRIPT_NAME'."

ตรวจสอบการจัดการข้อผิดพลาด

คุณเขียนสคริปต์ Bash เพื่อประมวลผลไฟล์บางส่วน และต้องการให้สคริปต์ออกจากการทำงานทันทีหากคำสั่งใด ๆ ภายในสคริปต์ล้มเหลว นอกจากนี้ยังต้องการให้แน่ใจว่าไดเรกทอรีชั่วคราวได้รับการล้างข้อมูลไม่ว่าสคริปต์จะออกจากการทำงานอย่างไร

คุณควรใช้คำสั่ง Bash ใดเป็นหลักสองคำสั่งเพื่อให้บรรลุเป้าหมายนี้

สรุปและขั้นตอนถัดไป

คุณได้เรียนรู้วิธีทำให้สคริปต์ Bash มีความทนทานมากขึ้นและแก้ไขข้อผิดพลาดได้ง่ายขึ้นแล้ว

  • รหัสการออก: ทำความเข้าใจว่าคำสั่งสำเร็จหรือล้มเหลว
  • set -e: ออกจากการทำงานโดยอัตโนมัติเมื่อเกิดข้อผิดพลาด
  • trap: ดำเนินการล้างข้อมูลเมื่อสคริปต์ออกจากการทำงาน
  • การเปลี่ยนเส้นทางผลลัพธ์: ควบคุมตำแหน่งที่ stdout และ stderr ถูกส่งไป
  • การประทับเวลา: เพิ่มบริบทให้บันทึกของคุณ
  • logger: เชื่อมต่อกับระบบบันทึกทั่วทั้งระบบ

เมื่อใช้เทคนิคเหล่านี้ งานอัตโนมัติของคุณจะน่าเชื่อถือและจัดการได้ง่ายขึ้น หมั่นฝึกฝนเพื่อสร้างระบบอัตโนมัติที่ทนทานอย่างแท้จริง

คำถามที่พบบ่อย

บทเรียน “การจัดการข้อผิดพลาดและการบันทึกในสคริปต์” ฟรีหรือไม่

ใช่ — ข้อความเต็มของ “การจัดการข้อผิดพลาดและการบันทึกในสคริปต์” ฟรีให้อ่านที่นี่บนเว็บ เพื่อปฏิบัติแบบโต้ตอบ (ตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7) และปลดล็อคส่วนที่เหลือของคอร์ส Linux Server Deployment & SSH Mastery ให้อัปเกรดเป็น CoddyKit PRO คอร์ส Linux Server Deployment & SSH Mastery มีบทเรียนทั้งหมด 4 บทเรียน

คุณจะเรียนรู้อะไรในบทเรียน “การจัดการข้อผิดพลาดและการบันทึกในสคริปต์”

นำการจัดการข้อผิดพลาดที่รัดกุมมาใช้ เปลี่ยนเส้นทางผลลัพธ์ของสคริปต์ และสร้างบันทึกที่มีความหมายเพื่อติดตามการทำงานของสคริปต์และแก้ไขปัญหา คุณปฏิบัติ Linux Server Deployment & SSH Mastery ด้วยโค้ดที่ใช้งานได้จริงที่คุณเรียกใช้โดยตรงในเบราว์เซอร์ และติวเตอร์ AI ตลอด 24/7 ตอบคำถามของคุณขณะที่คุณไปผ่านบทเรียน

คุณต้องมีประสบการณ์ก่อนที่จะเริ่มเรียน Linux Server Deployment & SSH Mastery หรือไม่

ไม่จำเป็นต้องมีประสบการณ์มาก่อน Linux Server Deployment & SSH Mastery บน CoddyKit ออกแบบมาสำหรับผู้เริ่มต้นไปจนถึงผู้เรียนขั้นสูง คุณสามารถเริ่มต้นที่นี่หรือเริ่มจากตัวแรกและเรียนด้วยความเร็วของคุณเอง นี่คือบทเรียนที่ 3 จากทั้งหมด 4 บทเรียน

บทเรียน “การจัดการข้อผิดพลาดและการบันทึกในสคริปต์” ใช้เวลานานแค่ไหน

บทเรียน CoddyKit ส่วนใหญ่ใช้เวลาประมาณ 5–10 นาที แต่ละบทเรียนจึงสั้นและเป็นแบบโต้ตอบ คุณสามารถก้าวหน้าอย่างต่อเนื่องและกลับมาเรียนต่อจากตรงที่เพิ่งหยุดบนเว็บและแอปได้เลย

ฉันเขียนและรันโค้ดในบทเรียน Linux Server Deployment & SSH Mastery นี้ได้ไหม

ได้ บทเรียน Linux Server Deployment & SSH Mastery ทุกบทมีตัวแก้ไขโค้ดในตัว คุณจึงเขียนและรันโค้ดจริงได้เลยในเบราว์เซอร์ และได้รับข้อเสนอแนะจาก AI ในทันที — ไม่ต้องติดตั้งในเครื่องของคุณ

บทเรียนทั้งหมดในหลักสูตรนี้

  1. บทนำสู่การเขียนสคริปต์ Bash
  2. การทำงานเซิร์ฟเวอร์โดยอัตโนมัติ
  3. การจัดการข้อผิดพลาดและการบันทึกในสคริปต์
  4. ฟังก์ชัน อาร์กิวเมนต์ และสคริปต์ที่นำกลับมาใช้ซ้ำได้
← กลับไปที่ Linux Server Deployment & SSH Mastery