การจัดการข้อผิดพลาดและการบันทึกในสคริปต์
นำการจัดการข้อผิดพลาดที่รัดกุมมาใช้ เปลี่ยนเส้นทางผลลัพธ์ของสคริปต์ และสร้างบันทึกที่มีความหมายเพื่อติดตามการทำงานของสคริปต์และแก้ไขปัญหา
การจัดการข้อผิดพลาดและการบันทึกในสคริปต์ เป็นบทเรียน 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 ไปยังfilecommand 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 ในทันที — ไม่ต้องติดตั้งในเครื่องของคุณ
บทเรียนทั้งหมดในหลักสูตรนี้
- บทนำสู่การเขียนสคริปต์ Bash
- การทำงานเซิร์ฟเวอร์โดยอัตโนมัติ
- การจัดการข้อผิดพลาดและการบันทึกในสคริปต์
- ฟังก์ชัน อาร์กิวเมนต์ และสคริปต์ที่นำกลับมาใช้ซ้ำได้