Cron job: lên lịch tự động chạy tác vụ trên Linux

  • author-image

    Nguyễn Đình Cường

  • blog-tag
  • blog-comment 0 comment
  • created-date 09 Nov, 2026
blog-thumbnail

Sao lưu database mỗi đêm, dọn file tạm mỗi tuần, gửi báo cáo mỗi sáng thứ Hai: những việc lặp lại như vậy không nên làm bằng tay. Cron là bộ lập lịch có sẵn trên Linux, đơn giản nhưng cực kỳ bền bỉ. Hiểu cú pháp của nó là đủ để tự động hóa rất nhiều thứ.

Cron và crontab

Cron là dịch vụ chạy nền, kiểm tra mỗi phút xem có tác vụ nào đến giờ. Danh sách tác vụ của mỗi người dùng nằm trong file crontab. Bạn chỉnh bằng:

crontab -e
crontab -l

Lệnh đầu mở trình soạn thảo để sửa, lệnh sau liệt kê các tác vụ hiện có.

Cú pháp năm trường thời gian

# phut gio ngay thang thu  lenh
  *    *   *    *     *    /duong/dan/lenh
TrườngGiá trị
Phút0-59
Giờ0-23
Ngày trong tháng1-31
Tháng1-12
Thứ trong tuần0-7 (0 và 7 đều là Chủ nhật)

Ký hiệu đặc biệt: * là mọi giá trị, , liệt kê (ví dụ 1,15), - là khoảng (ví dụ 1-5), / là bước (ví dụ */10 là mỗi 10).

Một số ví dụ quen thuộc

0 2 * * * /opt/scripts/backup.sh
*/15 * * * * /opt/scripts/kiem-tra.sh
30 8 * * 1 /opt/scripts/bao-cao-tuan.sh
0 0 1 * * /opt/scripts/don-dep-thang.sh
0 9-17 * * 1-5 /opt/scripts/gio-hanh-chinh.sh

Theo thứ tự: 2 giờ sáng mỗi ngày; mỗi 15 phút; 8 giờ 30 sáng thứ Hai hằng tuần; 0 giờ ngày mùng 1 hằng tháng; đầu mỗi giờ từ 9 đến 17 giờ các ngày trong tuần từ thứ Hai đến thứ Sáu.

Những cái bẫy thường gặp

  1. Môi trường khác với terminal: cron chạy với biến PATH rất tối giản. Hãy dùng đường dẫn tuyệt đối cho cả lệnh lẫn file.
  2. Không có log: nếu tác vụ lỗi, bạn sẽ không biết. Chuyển đầu ra vào file.
  3. Múi giờ: cron dùng múi giờ của máy chủ, hãy kiểm tra bằng lệnh date.
  4. Dấu %: trong crontab có ý nghĩa đặc biệt, phải viết \%. Cách đơn giản là đưa lệnh vào script.
  5. Tác vụ chạy chồng nhau: tác vụ cũ chưa xong, tác vụ mới đã bắt đầu. Dùng khóa tệp bằng flock.

Ghi log đúng cách

0 2 * * * /opt/scripts/backup.sh >> /var/log/backup.log 2>&1

Phần >> ghi nối vào file, còn 2>&1 đưa cả luồng lỗi vào cùng chỗ. Nhờ đó khi sự cố xảy ra bạn có manh mối để điều tra.

Tránh chạy chồng nhau với flock

*/5 * * * * flock -n /tmp/dongbo.lock /opt/scripts/dongbo.sh

Cờ -n khiến lệnh bỏ qua nếu lần chạy trước còn đang giữ khóa.

Một script mẫu cho cron

#!/bin/bash
set -euo pipefail
NGAY=$(date +%F)
tar -czf /backup/web-$NGAY.tar.gz /var/www/app
find /backup -name 'web-*.tar.gz' -mtime +7 -delete
echo "Xong $NGAY"

Script nén thư mục web theo ngày rồi xóa bản sao lưu cũ hơn 7 ngày. Dòng set -euo pipefail giúp script dừng ngay khi có lỗi thay vì chạy tiếp một cách mù quáng. Nhớ cấp quyền chạy bằng chmod +x.

Lựa chọn khác: systemd timer và bộ lập lịch của framework

systemd timer cho phép ghi nhật ký tốt hơn và xử lý trường hợp máy tắt đúng lúc đến hẹn. Nhiều framework (như Laravel) cũng có bộ lập lịch riêng, chỉ cần một dòng cron chạy mỗi phút để kích hoạt. Hãy chọn công cụ phù hợp với nhu cầu của bạn.

Kết luận

Nhớ cấu trúc năm trường, dùng đường dẫn tuyệt đối, luôn ghi log và đề phòng tác vụ chạy chồng nhau là bạn đã làm chủ cron. Hãy thử lên lịch một tác vụ nhỏ ngay hôm nay, ví dụ sao lưu thư mục dự án mỗi đêm.

Muốn học cách tự động hóa vận hành trên máy chủ một cách bài bản, hãy xem các khóa học tại codebem.com.

author_photo
Nguyễn Đình Cường

0 comment