Danh sách bài viết trong series Bashscript từ cơ bản đến áp dụng vào DevOps
- Bài 1. Cơ Bản Bash Script trong DevOps
- Bài 2. Điều Kiện trong Bash DevOps: Xử Lý Logic Cơ Bản
- Bài 3. Vòng Lặp trong Bash DevOps: Tự Động Hóa Lặp Lại Hiệu Quả
- Bài 4. Xử Lý File trong Bash DevOps: Đọc, Ghi và Quản Lý Hiệu Quả
- Bài 5. Text Processing trong Bash DevOps: Grep, Awk, Sed Hiệu Quả
- Bài 6. Function trong Bash DevOps: Tái Sử Dụng Code Hiệu Quả
- Bài 7. Quản Lý Biến và Môi Trường trong Bash DevOps
- Bài 8. Cron Job trong Bash DevOps: Tự Động Hóa Theo Lịch Hiệu Quả
- Bài 9. Debug trong Bash DevOps: Tìm và Sửa Lỗi Hiệu Quả
- Bài 10. Error Handling Bash DevOps: Xử Lý Ngoại Lệ Hiệu Quả
- Bài 11. Bash trong CI/CD DevOps: Tích Hợp Pipeline Hiệu Quả
- Bài 12. Quản Lý Hệ Thống với Bash DevOps: Theo Dõi và Can Thiệp Hiệu Quả
- Bài 13. Tự Động Hóa SSH với Bash DevOps: Quản Lý Multi-Server Hiệu Quả
- Bài 14. Bash và Docker trong DevOps: Quản Lý Container Hiệu Quả
- Bài 15. Monitoring với Bash DevOps: Báo Cáo Hệ Thống Hiệu Quả
- Bài 16. Bash Nâng Cao: Parallel Execution trong DevOps Hiệu Quả
- Bài 17. Bash và API trong DevOps: Gọi và Xử Lý API Hiệu Quả
- Bài 18. Bash và Cloud CLI trong DevOps: Quản Lý Cloud Hiệu Quả
- Bài 19. Bash và Security trong DevOps: Bảo Mật Script Hiệu Quả
- Bài 20. Best Practice trong Bash DevOps: Làm Chủ Script Hiệu Quả
Error Handling trong Bash – Xử Lý Ngoại Lệ trong DevOps
Script Bash không phải lúc nào cũng chạy trơn tru – file mất, lệnh fail, hoặc điều kiện bất ngờ có thể làm hỏng mọi thứ. Error Handling trong Bash DevOps giúp bạn xử lý lỗi Bash một cách thông minh, giữ script ổn định trong pipeline hay production. Trong bài thứ mười của series Bash Script Chuyên Sâu cho DevOps, tôi sẽ dẫn bạn qua cách dùng trap Bash, exit code Bash, và thực hành script an toàn. Đây là kinh nghiệm tôi rút ra từ những lần script crash giữa đêm, không chỉ là lý thuyết đâu nhé!
Error Handling Là Gì?
Xử Lý Lỗi trong Bash
Error handling là cách phát hiện và phản ứng với lỗi:
- Dừng script khi cần.
- Ghi log lỗi để debug.
- Thử lại lệnh thất bại.
Ví dụ: Script backup fail vì disk đầy – thay vì tiếp tục chạy, nó dừng và báo lỗi.
Tại Sao Quan Trọng trong DevOps?
- Ổn định: Ngăn script gây lỗi dây chuyền (VD: deploy nửa vời).
- Debug dễ hơn: Biết lỗi xảy ra ở đâu, tại sao.
- Tự động hóa an toàn: Xử lý ngoại lệ trong cron/pipeline.
Thực tế: Tôi từng để script chạy mà không xử lý lỗi, kết quả là xóa nhầm file quan trọng – từ đó luôn thêm error handling.
Công Cụ Error Handling trong Bash
Exit Code Bash
Mỗi lệnh trả về exit code ($?
):
: Thành công.
- Khác
: Thất bại.
ls /nonexistent
if [ $? -ne 0 ]; then
echo "Lệnh thất bại"
fi
Set -e: Thoát Khi Lỗi
Dừng script ngay khi lệnh fail (bài 9):
#!/bin/bash
set -e
ls /nonexistent # Dừng tại đây
echo "Không chạy tới đây"
Trap Bash: Bắt Lỗi
Trap bắt tín hiệu (signal) hoặc lỗi để xử lý:
trap 'echo "Lỗi xảy ra!"' ERR
ls /nonexistent # Kích hoạt trap
echo "Tiếp tục" # Vẫn chạy
-
ERR
: Bắt lỗi từ lệnh fail. -
Trap khi thoát:
trap 'echo "Script kết thúc"' EXIT
Retry Logic
Thử lại lệnh thất bại:
COUNT=0
MAX_TRIES=3
until ls /nonexistent || [ $COUNT -ge $MAX_TRIES ]
do
COUNT=$((COUNT + 1))
echo "Thử lại lần $COUNT..."
sleep 1
done
Thực Hành: Script An Toàn với Error Handling
Script Kiểm Tra Hệ Thống
Tạo safe_check.sh
:
#!/bin/bash
# Thiết lập error handling
set -e # Thoát khi lỗi
trap 'echo "Lỗi tại dòng $LINENO: $BASH_COMMAND" >&2; exit 1' ERR
trap 'echo "Script hoàn tất"' EXIT
# Biến
LOG_FILE="/var/log/safe_check.log"
TIMESTAMP=$(date "+%Y-%m-%d %H:%M:%S")
# Hàm ghi log
log() {
echo "[$TIMESTAMP] $1" >> "$LOG_FILE" 2>/dev/null || {
echo "Không thể ghi log: $LOG_FILE" >&2
exit 1
}
}
# Kiểm tra disk
DISK=$(df -h / | tail -1 | awk '{print $5}' | cut -d'%' -f1) || {
echo "Lỗi khi kiểm tra disk" >&2
exit 1
}
if [ "$DISK" -gt 80 ]; then
log "Cảnh báo: Disk vượt $DISK%"
else
log "Disk ổn: $DISK%"
fi
# Kiểm tra file không tồn tại (mô phỏng lỗi)
cat /nonexistent/file # Sẽ kích hoạt trap
log "Kiểm tra hoàn tất" # Không chạy tới đây
Chạy và Test
chmod +x safe_check.sh
./safe_check.sh
- Kết quả mẫu:
Lỗi tại dòng 25: cat /nonexistent/file Script hoàn tất
- Check
safe_check.log
:[2025-03-13 10:00:00] Disk ổn: 42%
Giải thích:
set -e
: Dừng khi lệnh fail.trap ERR
: In lỗi và dòng gây lỗi.trap EXIT
: Chạy khi script kết thúc.|| { ... }
: Xử lý lỗi cụ thể cho lệnh.
DevOps: Script này an toàn cho cron, tránh lỗi không kiểm soát.
Debug và Cải Tiến
-
Thêm retry:
COUNT=0 MAX_TRIES=3 until DISK=$(df -h / | tail -1 | awk '{print $5}' | cut -d'%' -f1) || [ $COUNT -ge $MAX_TRIES ] do COUNT=$((COUNT + 1)) echo "Thử lại disk lần $COUNT..." >&2 sleep 1 done
-
Kiểm tra log:
tail -f /var/log/safe_check.log
Thực tế: Tôi từng bỏ qua lỗi ghi log, script chạy “âm thầm” fail – trap và retry giúp tôi khắc phục.
Ứng Dụng trong DevOps
Pipeline CI/CD
- Script an toàn trong CI:
deploy: script: - | set -e trap 'echo "Deploy fail" >&2; exit 1' ERR docker push myapp
Giám Sát Hệ Thống
- Cron job với xử lý lỗi:
0 * * * * /home/user/safe_check.sh >> /var/log/cron.log 2>&1
Case study: Một team thêm trap vào script backup, phát hiện disk đầy sớm – tránh mất dữ liệu quan trọng.
Best Practice
- Dùng
set -e
cho script quan trọng. - Trap
ERR
để ghi log lỗi. - Kiểm tra
$?
sau lệnh nhạy cảm.
Kết Luận
Error Handling trong Bash DevOps với xử lý lỗi Bash, trap Bash, và exit code Bash giúp bạn xây dựng script an toàn, đáng tin cậy. Thực hành với safe_check.sh
cho thấy bạn có thể kiểm soát ngoại lệ hiệu quả – bước tiến lớn trong tự động hóa DevOps. Bài tiếp theo, chúng ta sẽ khám phá Bash trong CI/CD – cách tích hợp script vào pipeline như pro.