10 Bash Script Đơn Giản Để Tự Động Hóa Quy Trình DevOps
Tuyển tập 10 Bash script nhỏ mà hữu ích cho DevOps: backup, dọn tmp, giám sát disk, restart service, batch rename, xoay log, nén archive, kiểm tra SSL, ping hàng loạt và đồng bộ thư mục.
Vì sao nên sưu tầm script nhỏ?
Trong series Bash, chúng ta đã học từ biến, điều kiện, vòng lặp đến error handling, cron và best practice. Nhưng giá trị thực sự của Bash nằm ở những script nhỏ chạy mỗi ngày: backup đêm, dọn disk đầy, restart service crash lúc 2 giờ sáng.
Bài viết này tổng hợp 10 script gọn nhẹ, đúng chất DevOps. Mỗi script dưới 30 dòng, tuân thủ set -euo pipefail, quote biến đầy đủ, và có thể gắn vào cron ngay. Đây là sườn ý tưởng tham khảo từ cộng đồng, được viết lại hoàn toàn theo chuẩn của series.
Sao lưu thư mục theo ngày
Nhu cầu cơ bản nhất: sao lưu thư mục config hoặc data mỗi đêm.
| |
Giải thích:
tar -czfnén toàn bộ thư mục thành một file duy nhất, dễ copy đi nơi khác.-Ckết hợpdirname/basenameđể tránh lưu absolute path trong archive.find -mtimetự dọn backup cũ, tránh đầy disk — lỗi kinh điển khi chỉ backup mà quên dọn.- Nhận
SOURCE_DIRqua tham số thay vì hardcode, tái sử dụng cho nhiều app.
Dọn file tạm và cache cũ
Thư mục /tmp và thư mục cache phình to là nguyên nhân phổ biến gây đầy disk.
| |
Giải thích:
find -mtime +7 -deletechỉ xóa file cũ, không đụng đến file đang dùng.-printtrước-deleteđể có log những gì đã xóa, tiện audit.- Kiểm tra
-dtrước khi xóa để tránh typo xóa nhầm thư mục. - Chạy khô trước với
-printthay vì-deletekhi thử nghiệm trên production.
Giám sát dung lượng disk
Phiên bản gọn của script monitoring trong bài monitoring: kiểm tra và cảnh báo khi vượt ngưỡng.
| |
Giải thích:
df --output=pcentlấy đúng cột phần trăm, ổn định hơn parsedfmặc định.tr -dc '0-9'bóc số khỏi chuỗi82%.- Exit code
1khi vượt ngưỡng để cron hoặc pipeline phát hiện lỗi. - Gắn vào cron mỗi 30 phút, hoặc gọi webhook khi exit code khác 0.
Tự động restart service khi crash
Kịch bản on-call kinh điển: service dừng mà không ai biết.
| |
Giải thích:
systemctl is-active --quietkiểm tra trạng thái bằng exit code, không cần parse text.- Restart xong phải verify lại sau vài giây, tránh báo cáo sai là đã phục hồi.
- Đặt trong cron mỗi 5 phút cho service quan trọng, kết hợp log vào file để truy vết.
- Với nhiều server, bọc vòng lặp SSH như trong bài SSH.
Đổi tên file hàng loạt
Khi deploy hoặc xoay log, ta thường cần đổi tên hàng loạt file theo pattern.
| |
Giải thích:
nullglobđể glob không khớp thì trả về rỗng thay vì chuỗi pattern thô."${files[@]}"quote đúng cách để xử lý tên file có khoảng trắng.mv --tránh nhầm tên file bắt đầu bằng-thành option.- Hậu tố ngày giúp sắp xếp và tìm kiếm dễ dàng.
Xoay log thủ công
Trước khi dùng logrotate hệ thống, hiểu cơ chế xoay log bằng Bash giúp debug dễ hơn.
| |
Giải thích:
du -mlấy kích thước theo MB để so sánh ngưỡng.- Vòng lặp ngược giữ tối đa
KEEP_FILESbản, bản cũ nhất tự bị ghi đè. touchtạo file log mới ngay để app không ghi vào file đã di chuyển.- Với app ghi log liên tục, nên gửi signal reload cho app sau khi xoay.
Nén archive cho log cũ
Sau khi xoay log, nén các bản cũ để tiết kiệm disk.
| |
Giải thích:
! -name "*.gz"tránh nén lại file đã nén.-print0kết hợpread -d ''xử lý an toàn tên file có khoảng trắng hoặc ký tự đặc biệt.gzip -9mức nén cao nhất, phù hợp cho log text.- Chạy weekly qua cron, sau bước xoay log.
Kiểm tra hạn chứng chỉ SSL
Chứng chỉ hết hạn mà quên renew là sự cố dễ tránh nhất.
| |
Giải thích:
openssl s_client -connectlấy chain chứng chỉ thật từ server đang chạy.-servername(SNI) bắt buộc khi một IP phục vụ nhiều domain.- Đổi ngày hết hạn sang epoch để tính số ngày còn lại chính xác.
- Exit code phân biệt
WARNINGvàCRITICALđể hệ thống cảnh báo routing đúng kênh.
Ping kiểm tra hàng loạt host
Khi quản lý nhiều server, cần kiểm tra nhanh host nào còn sống.
| |
File hosts.txt mẫu:
| |
Giải thích:
ping -c 2 -W 2gửi 2 gói, timeout 2 giây mỗi gói — đủ nhanh cho hàng chục host.- Đọc file theo dòng với
while read, bỏ qua comment#để document trực tiếp trong file. || [[ -n "$host" ]]xử lý dòng cuối thiếu newline.- Nâng cấp tiếp theo: chạy song song với
&vàwaitnhư trong bài parallel.
Đồng bộ thư mục với rsync
Sao chép thư mục giữa hai máy hoặc backup tăng dần (incremental) nhanh hơn cp nhiều.
| |
Giải thích:
-agiữ permission, owner, timestamp;-znén trên đường truyền;-vlog chi tiết.--deleteđồng bộ xóa — file đã xóa ở nguồn cũng xóa ở đích, giữ hai bên giống hệt nhau.--excludebỏ qua cache và file tạm, giảm dung lượng đáng kể.- Dấu
/cuốiSOURCE_DIRrất quan trọng trong rsync: có/là copy nội dung, không có là copy cả thư mục.
Cách chạy và lên lịch
Cấp quyền và chạy thử
| |
Gắn vào cron
| |
Lưu ý về cron đã phân tích kỹ trong bài cron: luôn dùng absolute path, khai báo PATH và biến môi trường đầy đủ, redirect cả stdout và stderr ra log.
Ghi chú triển khai
- Đừng hardcode secret: Mọi script trên đều nhận tham số hoặc biến môi trường. Không nhúng password, token, webhook URL vào file. Dùng file
.envvớichmod 600vàsourcekhi cần. - Luôn quote biến:
"$SOURCE_DIR","${files[@]}"— quy tắc từ bài best practice. Script nhỏ càng dễ chủ quan, càng dễ dính lỗi word splitting khi gặp tên file có dấu cách. - Fail nhanh, báo rõ: Dùng
set -euo pipefail, validate input đầu script, trả exit code có nghĩa để cron và pipeline phát hiện lỗi. Script chạy xong lặng lẽ không có nghĩa là chạy đúng. - Chạy khô trước trên production: Với script xóa (
cleanup,find -delete) và đồng bộ (rsync --delete), lần đầu chạy với-printhoặc--dry-run, xác nhận danh sách file rồi mới cho xóa thật. - Một script một việc: Mỗi file trên chỉ làm một task. Khi cần chuỗi nhiều bước, viết script điều phối gọi từng script con, thay vì nhồi tất cả vào một file dài khó test.
- Lint trước khi commit: Chạy
shellcheckvàbash -ncho cả 10 script. Đưa vào pre-commit hoặc CI để team giữ chuẩn thống nhất.
Lời kết
Mười script trên không có gì cao siêu — backup, dọn tmp, check disk, restart service, rename, xoay log, nén archive, check SSL, ping host, sync folder. Nhưng cộng lại, chúng tiết kiệm hàng giờ làm việc thủ công mỗi tuần và giảm trực tiếp sự cố trực đêm.
Hãy bắt đầu bằng một script duy nhất: chọn nỗi đau lớn nhất của team hiện tại, deploy script đó qua cron, quan sát một tuần, rồi mới thêm script tiếp theo. Khi các script nhỏ đã ổn định, bạn sẽ có nền tảng vững chắc để tiến tới Bash trong CI/CD và monitoring tập trung.
Đừng để automation nằm trên giấy — hãy chạy script đầu tiên ngay hôm nay.
