Bài 9. Debug trong Bash DevOps: Tìm và Sửa Lỗi Hiệu Quả

Debug Cơ Bản trong Bash – Tìm và Sửa Lỗi trong DevOps

Viết script Bash là một chuyện, nhưng khi nó không chạy như ý – lỗi cú pháp, logic sai, hay output trống – bạn cần kỹ năng debug trong Bash DevOps. Trong bài thứ chín của series Bash Script Chuyên Sâu cho DevOps, tôi sẽ dẫn bạn qua cách tìm lỗi Bash với set -x Bash, kiểm tra cú pháp Bash, và thực hành sửa lỗi thực tế. Đây là những mẹo tôi học được từ việc vật lộn với script trong pipeline và hệ thống, không chỉ là lý thuyết đâu nhé!

Tại Sao Debug Quan Trọng?

Lỗi trong Bash

Script Bash dễ lỗi vì:

  • Cú pháp sai (VD: quên $ trước biến).
  • Logic sai (VD: điều kiện không đúng).
  • Môi trường khác nhau (VD: chạy local ổn, CI fail).

Ví dụ: Script kiểm tra disk chạy local thì OK, nhưng cron job không ghi log – debug giúp tìm ra nguyên nhân.

Lợi Ích trong DevOps

  • Nhanh chóng: Tìm lỗi trong phút thay vì giờ.
  • Ổn định: Đảm bảo script chạy đúng trong pipeline/production.
  • Học hỏi: Hiểu sâu hơn về Bash qua debug.

Thực tế: Tôi từng debug script cron fail vì thiếu đường dẫn tuyệt đối – 5 phút với set -x thay vì mò cả ngày.

Công Cụ Debug Cơ Bản trong Bash

Set -x Bash: Theo Dõi Thực Thi

Thêm set -x để in từng lệnh khi chạy:

#!/bin/bash
set -x
DISK=$(df -h / | tail -1 | awk '{print $5}')
echo "Disk: $DISK"
  • Chạy:
    ./script.sh
    • Output:
    • df -h /
    • tail -1
    • awk ‘{print $5}’
    • DISK=42%
    • echo ‘Disk: 42%’ Disk: 42%

Tips: Dùng -x khi chạy: bash -x script.sh.

Kiểm Tra Cú Pháp Bash

Kiểm tra lỗi cú pháp mà không chạy:

bash -n script.sh
  • Nếu có lỗi (VD: thiếu fi), Bash sẽ báo:
    script.sh: line 5: syntax error: unexpected end of file

Set -e: Thoát Khi Lỗi

Thêm set -e để dừng script nếu lệnh fail:

#!/bin/bash
set -e
ls /nonexistent  # Lỗi, script dừng
echo "Không chạy tới đây"

Kiểm Tra Exit Code

Dùng $? để xem kết quả lệnh trước:

ls /nonexistent
if [ $? -ne 0 ]; then
    echo "Lệnh thất bại"
fi

Thực Hành: Debug Script Kiểm Tra Hệ Thống

Script Có Lỗi

Tạo buggy_check.sh (cố tình thêm lỗi):

#!/bin/bash

# Thiếu $ trước biến
DISK_USAGE=df -h / | tail -1 | awk '{print $5}'
if [ DISK_USAGE -gt 80 ]; then  # Sai cú pháp
    echo "Disk cao: $DISK_USAGE"
else
    echo "Disk OK: $DISK_USAGE"
fi

# Lệnh lỗi không xử lý
cat /nonexistent/log
echo "Tiếp tục chạy"  # Không nên chạy

Debug Bước Từng Bước

  1. Kiểm tra cú pháp:

    bash -n buggy_check.sh
    • Báo lỗi:
      buggy_check.sh: line 5: [: DISK_USAGE: integer expression expected
  2. Dùng set -x:

    bash -x buggy_check.sh
    • Output:
      + df -h / | tail -1 | awk '{print $5}'
      + DISK_USAGE='df -h /'
      + '[' DISK_USAGE -gt 80 ']'
      buggy_check.sh: line 5: [: DISK_USAGE: integer expression expected
    • Phát hiện: Thiếu $DISK_USAGE=$(...).
  3. Sửa lỗi cú pháp:

    DISK_USAGE=$(df -h / | tail -1 | awk '{print $5}' | cut -d'%' -f1)
    if [ "$DISK_USAGE" -gt 80 ]; then
       echo "Disk cao: $DISK_USAGE%"
    else
       echo "Disk OK: $DISK_USAGE%"
    fi
  4. Thêm set -e:

    #!/bin/bash
    set -e
    DISK_USAGE=$(df -h / | tail -1 | awk '{print $5}' | cut -d'%' -f1)
    if [ "$DISK_USAGE" -gt 80 ]; then
       echo "Disk cao: $DISK_USAGE%"
    else
       echo "Disk OK: $DISK_USAGE%"
    fi
    cat /nonexistent/log  # Dừng tại đây
    echo "Không chạy tới đây"
  5. Chạy lại:

    ./buggy_check.sh
    • Kết quả mẫu:
      Disk OK: 42%
      cat: /nonexistent/log: No such file or directory

Giải thích:

  • set -x: Hiển thị lỗi thiếu $.
  • -n: Tìm lỗi cú pháp trước khi chạy.
  • set -e: Ngăn script chạy tiếp khi lỗi.

DevOps: Script này có thể dùng trong cron để kiểm tra disk, dừng nếu lỗi nghiêm trọng.

Debug Thực Tế

  • Thêm log debug:
    echo "Debug: DISK_USAGE=$DISK_USAGE" >&2
  • Kiểm tra cron log:
    grep CRON /var/log/syslog

Thực tế: Tôi từng debug script fail trong cron vì biến rỗng – set -x và log stderr cứu tôi.

Ứng Dụng trong DevOps

Debug Pipeline

  • Thêm debug trong CI:
    check_system:
    script:
      - bash -x ./buggy_check.sh

Giám Sát Hệ Thống

  • Script an toàn hơn:
    #!/bin/bash
    set -e
    DISK=$(df -h / | tail -1 | awk '{print $5}' | cut -d'%' -f1) || exit 1
    echo "Disk: $DISK%"

Case study: Một team debug script backup fail vì thiếu quyền – set -e giúp dừng sớm, tránh overwrite file rỗng.

Kết Luận

Debug trong Bash DevOps với set -x Bash, kiểm tra cú pháp Bash, và các mẹo cơ bản giúp bạn tìm lỗi Bash nhanh chóng. Thực hành với buggy_check.sh cho thấy bạn có thể sửa lỗi hiệu quả – kỹ năng cần thiết trong tự động hóa DevOps. Bài tiếp theo, chúng ta sẽ khám phá Error Handling trong Bash – cách xử lý ngoại lệ như pro.

Điều hướng chuỗi bài viết<< Bài 8. Cron Job trong Bash DevOps: Tự Động Hóa Theo Lịch Hiệu Quả
>> Bài 10. Error Handling Bash DevOps: Xử Lý Ngoại Lệ 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