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%
- Output:
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
- 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
- Báo lỗi:
- 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=$(...).
- Output:
- 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 - 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" - Chạy lại:
./buggy_check.sh- Kết quả mẫu:
Disk OK: 42% cat: /nonexistent/log: No such file or directory
- Kết quả mẫu:
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.
