Bài 10. Error Handling Bash DevOps: Xử Lý Ngoại Lệ 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.

Điều hướng chuỗi bài viết<< Bài 9. Debug trong Bash DevOps: Tìm và Sửa Lỗi Hiệu Quả
>> Bài 11. Bash trong CI/CD DevOps: Tích Hợp Pipeline Hiệu Quả
Chia sẻ bài viết:
Theo dõi
Thông báo của
0 Góp ý
Được bỏ phiếu nhiều nhất
Mới nhất Cũ nhất
Phản hồi nội tuyến
Xem tất cả bình luận

Có thể bạn quan tâm