Cron job là gì? Hẹn giờ tự động trên VPS đúng cách

Chia sẻ bài viết

Mục lục
Cron job là gì? Hẹn giờ tự động trên VPS đúng cách

Trả lời nhanh: Cron là người trực lịch của Linux: bạn khai "phút giờ ngày tháng thứ + lệnh" vào crontab, hệ thống tự chạy đúng hẹn, backup 2h sáng, dọn log Chủ nhật, gọi API mỗi 5 phút. Cú pháp 5 cột đọc từ trái: phút, giờ, ngày, tháng, thứ, ví dụ 0 2 * * * = 2:00 mỗi ngày. Ba bẫy người mới: cron chạy với PATH tối giản (lệnh chạy tay được, cron lại không thấy), không ai xem output (phải tự ghi log), và giờ máy chủ có thể là UTC (2h sáng của ai?).

Cron là công nghệ 50 tuổi vẫn gánh nửa thế giới tự động hóa, mọi bài trong cụm này (backup database, dọn log, đồng bộ) đều kết thúc bằng 'cho vào cron'. Bài này trả nợ khái niệm đó một lần cho trọn: cú pháp, ví dụ thật, và quan trọng nhất, những cái bẫy khiến cron 'chạy trên giấy mà không chạy trên máy' cùng cách giám sát để biết nó còn sống.

Tóm tắt nhanh
  • 5 cột: phút giờ ngày tháng thứ, crontab.guru là bạn thân khi mới học
  • crontab -e sửa lịch của user; việc cần root thì sudo crontab -e, hai sổ khác nhau
  • Luôn ghi log: lenh >> /var/log/viec.log 2>&1, cron im lặng là cron đáng ngờ
  • Bẫy lớn: PATH tối giản (dùng đường dẫn tuyệt đối), giờ UTC, lệnh chạy chồng khi quá lâu

Cú pháp 5 cột - học một lần nhớ mãi

┌ phut (0-59)
│ ┌ gio (0-23)
│ │ ┌ ngay (1-31)
│ │ │ ┌ thang (1-12)
│ │ │ │ ┌ thu (0-7, 0 va 7 = CN)
* * * * *  lenh

0 2 * * *        # 2:00 moi ngay, gio backup kinh dien
*/5 * * * *      # moi 5 phut, nhip goi API/health check
0 */6 * * *      # moi 6 tieng
30 8 * * 1-5     # 8:30 cac ngay lam viec
0 3 * * 0        # 3:00 sang Chu nhat, don dep tuan

Mở sổ lịch: crontab -e (của user hiện tại), xem lại: crontab -l. Việc đụng file hệ thống chạy bằng sổ của root: sudo crontab -e: nhớ rằng hai sổ độc lập, tìm không thấy job hãy xem sổ còn lại.

Bộ ví dụ thật - gom từ chính cụm bài này

# backup database 2h sang (bai backup database)
0 2 * * * /usr/bin/pg_dump -Fc shop > /var/backups/pg/shop-$(date +%u).dump 2>> /var/log/backup.log

# don log ung dung cu hon 14 ngay, 3h sang CN
0 3 * * 0 /usr/bin/find /home/ban/app/logs -name "*.log" -mtime +14 -delete

# goi API dong bo ton kho moi 15 phut, co log
*/15 * * * * /usr/bin/curl -s https://api.noi-bo/sync >> /var/log/sync.log 2>&1

# renew chung chi (neu khong dung Caddy tu dong)
0 4 * * 1 /usr/bin/certbot renew --quiet

Để ý hai chi tiết xuất hiện ở mọi dòng: đường dẫn tuyệt đối (/usr/bin/curl thay vì curl) và đuôi ghi log, hai thói quen chặn trước 80% sự cố cron.

Ba cái bẫy kinh điển - và thuốc từng cái

  • "Chạy tay được, cron không chạy": cron khởi động với môi trường tối giản, PATH ngắn, không biến shell của bạn. Thuốc: đường dẫn tuyệt đối cho mọi lệnh (which ten-lenh để tra), hoặc dòng đầu crontab khai PATH; script phức tạp thì gói vào file .sh có shebang và tự set env.
  • Giờ nào là 2h sáng? Máy chủ thường để UTC, 2h UTC là 9h sáng Việt Nam. Kiểm bằng lệnh date, và quy ước một lần: giữ máy UTC rồi tự quy đổi khi đặt lịch (site này gmt_offset=0 là ví dụ sống), tránh mỗi máy một múi giờ loạn sổ.
  • Lệnh chạy chồng: job 5 phút mà một lần chạy mất 7 phút → hai bản chồng nhau, tranh khóa, hỏng dữ liệu. Thuốc: bọc bằng flock, */5 * * * * /usr/bin/flock -n /tmp/sync.lock /duong-dan/sync.sh: bản mới tự bỏ lượt khi bản cũ chưa xong.

Giám sát cron: biết nó còn sống

Cron hỏng thầm lặng nguy hiểm nhất: backup 'vẫn chạy' suốt ba tháng, cho đến ngày cần restore. Ba tầng canh:

  1. Log của chính job (đã ghi ở trên) + thi thoảng liếc đuôi file.
  2. Heartbeat: cuối script gọi một URL check-in (Uptime Kuma có loại monitor Push chuyên việc này), job không gọi đúng hẹn là Kuma báo Telegram. Đảo logic từ 'báo khi chạy' thành 'báo khi vắng mặt', đúng thứ ta cần.
  3. Kiểm sản phẩm: với backup, cảnh báo nếu file mới nhất cũ hơn 25 giờ hoặc nhỏ bất thường, canh kết quả chứ không chỉ canh hành động.

Ghi chú bối cảnh WordPress: WP-Cron mặc định chỉ chạy khi có khách ghé, site vắng hoặc cache dày là lịch treo; chuyển sang system cron gọi wp-cron.php mỗi 5 phút là chuẩn vận hành (đúng bài học hệ thống này từng vá).

Ba bẫy kinh điển và thuốc từng cái

BẫyTriệu chứngThuốc
Đường dẫn và biến môi trường khác với lúc bạn gõ tayChạy tay được, chạy theo lịch thì khôngDùng đường dẫn tuyệt đối cho mọi lệnh và mọi tệp
Không ghi lại đầu raViệc thất bại mà không ai biếtChuyển cả đầu ra và lỗi vào một tệp nhật ký
Hai lần chạy chồng lên nhauViệc chạy lâu hơn chu kỳ, sinh hai tiến trình cùng lúcDùng cơ chế khóa để chỉ một lượt chạy tại một thời điểm
Múi giờ máy chủ khác múi giờ Việt NamViệc chạy lệch 7 tiếngĐặt múi giờ máy chủ, hoặc tính giờ theo múi giờ máy

Mẫu tệp lệnh an toàn, dùng lại được

#!/bin/bash
set -euo pipefail

# 1. Duong dan tuyet doi cho moi thu
CV=/opt/cong-viec
NHAT_KY=/var/log/cong-viec.log

# 2. Khoa: chi mot luot chay tai mot thoi diem
exec 9>/var/lock/cong-viec.lock
flock -n 9 || { echo "$(date) dang chay roi, bo qua" >> "$NHAT_KY"; exit 0; }

# 3. Ghi lai moi thu, ca dau ra lan loi
exec >> "$NHAT_KY" 2>&1
echo "=== bat dau $(date)"

# 4. Cong viec that
cd "$CV" && ./chay.sh

echo "=== xong $(date)"
# Dat vao cron, luon dung duong dan tuyet doi
crontab -e
# Kiem mui gio truoc
timedatectl set-timezone Asia/Ho_Chi_Minh

# 0 2 * * * /opt/cong-viec/chay-an-toan.sh

# Kiem cron da chay chua
grep CRON /var/log/syslog | tail -20
systemctl status cron

Giám sát: biết nó còn sống

  • Đặt cảnh báo khi không có tệp kết quả mới trong 26 giờ với việc chạy hằng ngày. Ngưỡng hơi rộng để không báo nhầm khi chạy trễ.
  • Gửi tín hiệu sống về một dịch vụ giám sát ở cuối mỗi lượt chạy thành công. Không nhận được tín hiệu là biết ngay.
  • Xoay vòng tệp nhật ký, nếu không nó sẽ làm đầy ổ sau vài tháng.
  • Đọc nhật ký một lần sau khi mới đặt lịch, vào đúng thời điểm nó chạy lần đầu. Rất nhiều lỗi lộ ra ngay lần chạy đầu tiên.

Câu hỏi thường gặp

Cron với n8n Schedule khác gì nhau, dùng cái nào?

Cùng ý tưởng hẹn giờ. Cron: việc hệ thống thuần lệnh (backup, dọn dẹp), nhẹ, không phụ thuộc gì. n8n: việc nghiệp vụ nhiều bước có điều kiện, cần nhìn lịch sử chạy trực quan. Máy một VPS dùng cả hai đúng vai là bình thường.

@reboot trong cron là gì?

Chạy lệnh mỗi lần máy khởi động, tiện cho việc khởi động dịch vụ thủ công. Nhưng dịch vụ nghiêm túc nên dùng systemd/PM2 startup (tự restart khi chết) thay vì @reboot (chỉ chạy một lần lúc boot).

Làm sao test cron job mà không chờ đến giờ hẹn?

Chạy tay chính dòng lệnh đó (nguyên văn, cả đường dẫn tuyệt đối); muốn giả lập môi trường cron sạch: env -i /bin/bash -c 'lenh cua ban'. Xong mới tin lịch.

Có giới hạn số cron job không?

Thực tế không đáng lo, hàng chục job là bình thường. Đáng lo là job nặng dồn cùng giờ: rải giờ lệch nhau (backup 2:00, dọn log 3:10...) cho máy thở, nhất là job ăn I/O.

Hạ tầng NVMe Enterprise của TND
VPS ổ Enterprise U.2 NVMe, CPU xung cao, đặt tại Việt Nam
Chiếc VPS là mảnh đất cho mọi lịch hẹn: TND VPS NVMe chạy các job đêm, backup, dọn dẹp, đồng bộ, vèo trên Enterprise U.2 NVMe RAID 10 không ai nhận ra, Xeon Platinum xung cao cho script xong sớm trả máy sớm. Uptime ổn định để lịch 2h sáng là 2h sáng, đều như vắt tranh, bàn giao 5 phút.
Chọn gói VPS NVMe phù hợp dự án của bạn

Bài viết liên quan