Bash Script: Tại sao chỉ gõ lệnh là chưa đủ?
Ba năm trước, mình từng thức trắng đêm chỉ để gõ thủ công lệnh backup cho 10 con VPS production. Lúc đó, mình chỉ biết dùng history rồi copy-paste lại. Sai lầm ập đến khi mình gõ nhầm dấu cách sau lệnh rm -rf /. May mắn là mình dừng kịp, nhưng phen đó đủ để mình hiểu: Muốn thăng tiến trong nghề Linux, bạn bắt buộc phải biết tự động hóa.
Chọn công cụ nào để tự động hóa?
Khi một tác vụ lặp lại quá 3 lần, bạn nên dừng việc gõ tay. Thông thường, chúng ta có vài lựa chọn:
- Gõ lệnh thủ công: Nhanh với task làm đúng một lần. Tuy nhiên, nó là “ác mộng” nếu bạn cần thực thi trên 20 server cùng lúc.
- Dùng Alias: Tuyệt vời cho các lệnh ngắn như
alias ll='ls -la'. Nhưng Alias không thể xử lý logic phức tạp hay điều kiệnif-else. - Bash Script: Lựa chọn cân bằng nhất. Nó chạy trực tiếp trên mọi distro Linux, không cần cài đặt thêm Python hay Node.js.
- Ansible/Terraform: Cực mạnh cho hạ tầng lớn. Nhưng nếu bạn chỉ muốn check nhanh dung lượng đĩa cứng, chúng lại quá cồng kềnh.
Tại sao nên (và không nên) dùng Bash?
Điểm cộng:
- Có sẵn 100% trên Ubuntu, CentOS hay cả Alpine siêu nhẹ.
- Tương tác với file và tiến trình hệ thống với độ trễ gần như bằng 0.
- Mọi lỗi bạn gặp đều đã có lời giải trên StackOverflow từ 10 năm trước.
Điểm trừ:
- Cú pháp Bash chứa đầy những “cạm bẫy” về khoảng trắng.
- Việc debug đôi khi gây ức chế hơn các ngôn ngữ bậc cao.
- Dễ biến thành đống code rối rắm nếu bạn lười chia hàm.
4 bước xây dựng Script “chuẩn chỉ” cho production
Để tránh cảnh script chạy lung tung rồi xóa nhầm dữ liệu, mình luôn áp dụng quy trình 4 bước sau.
1. Luôn dùng Shebang và Biến
Dòng #! /bin/bash ở đầu file là bắt buộc. Nó giúp hệ thống biết chính xác trình thông dịch nào cần dùng. Ngoài ra, hãy đặt tên biến rõ ràng thay vì dùng giá trị cứng (hard-code).
#!/bin/bash
# Luôn viết hoa tên biến môi trường để dễ quản lý
BACKUP_DIR="/var/backups/nginx_logs"
CURRENT_USER=$(whoami)
echo "Chào $CURRENT_USER, hệ thống bắt đầu backup vào $BACKUP_DIR"
2. Kiểm soát điều kiện (Conditionals)
Trong Bash, dấu ngoặc vuông [[ ]] linh hoạt hơn loại đơn [ ]. Một quy tắc sắt đá: Luôn để khoảng trắng bao quanh dấu ngoặc. Thiếu nó, script của bạn sẽ dừng hoạt động ngay lập tức.
if [[ ! -d "$BACKUP_DIR" ]]; then
echo "Thư mục chưa có. Đang khởi tạo..."
mkdir -p "$BACKUP_DIR"
else
echo "Thư mục đã tồn tại, tiếp tục xử lý."
fi
3. Tối ưu với vòng lặp (Loops)
Giả sử bạn cần nén 50 file log cũ để giải phóng 80% dung lượng ổ cứng. Vòng lặp for sẽ giải quyết việc này trong chưa đầy 2 giây.
# Nén toàn bộ file .log trong thư mục hiện tại
for log_file in *.log; do
echo "Đang nén: $log_file"
tar -czf "${log_file}.tar.gz" "$log_file"
done
4. Đóng gói code vào hàm (Functions)
Nếu bạn thấy mình viết echo quá nhiều lần để thông báo trạng thái, hãy tạo một hàm log riêng. Điều này giúp code gọn gàng và dễ bảo trì hơn nhiều.
notify() {
local status=$1
local msg=$2
echo "[$(date +'%H:%M:%S')] [$status] $msg"
}
notify "INFO" "Script đang khởi động..."
notify "ERROR" "Database không phản hồi!"
Kỹ thuật xử lý lỗi để “sống sót” trên Production
Script xịn khác script vỡ lòng ở cách nó xử lý thất bại. Một sai lầm nhỏ trong script backup có thể khiến bạn mất sạch dữ liệu nếu không kiểm tra lỗi.
Bộ ba quyền lực: set -euo pipefail
Mình luôn thêm dòng này vào sau Shebang. Nó là “bảo hiểm” cho mọi script:
-e: Dừng script ngay khi có bất kỳ lệnh nào bị lỗi.-u: Báo lỗi nếu bạn gọi một biến chưa khai báo.-o pipefail: Bắt lỗi ngay cả khi nó nằm sau dấu gạch đứng|.
Kiểm tra Exit Code ($?)
Sau những lệnh quan trọng như rsync hay mysqldump, hãy kiểm tra biến $?. Giá trị bằng 0 nghĩa là thành công, ngược lại là có vấn đề.
rsync -avz /src/ /dest/
if [[ $? -ne 0 ]]; then
echo "Lỗi đồng bộ! Kiểm tra lại kết nối mạng."
exit 1
fi
Lời kết từ kinh nghiệm thực tế
Viết Bash không khó, cái khó là viết sao cho an toàn. Sau nhiều năm vận hành, mình rút ra nguyên tắc: Luôn chạy thử script trên môi trường Staging. Đừng bao giờ tin hoàn toàn vào những gì bạn vừa gõ.
Nếu script vượt quá 500 dòng, đó là lúc bạn nên chuyển sang Python. Nhưng với các tác vụ sysadmin hàng ngày, Bash vẫn là “vua”. Hãy bắt đầu từ những script nhỏ, bạn sẽ thấy hiệu suất làm việc tăng lên đáng kể.

