AnhDH
Published on
12 mins read

CronJob & Cron Expressions

banner

Hi các bạn 👋. Mình là Hùng Anh.

Việc lặp đi lặp lại cùng một công việc mỗi ngày có thể trở nên nhàm chán và mệt mỏi. Đây chính là lúc tự động hóa trở thành cứu cánh. Đã đến lúc bạn cần sử dụng CronJob, nó là một tác vụ cụ thể được lên lịch để thực hiện định kỳ. Tuy nhiên, để có thể lập lịch CronJob chính xác, bạn cần hiểu rõ về Cron Expression – một biểu thức giúp xác định lịch trình chính xác cho các tác vụ tự động.

Trong bài viết này, hãy cùng mình tìm hiểu CronJob, cách xây dựng Cron Expression, cũng như một số công cụ giúp chúng ta tạo ra các biểu thức cron một cách dễ dàng hơn nhé.

Bắt đầu thôi.

Table of Contents

1. CronJob là gì?

what-is-cronjob

CronJob là một tác vụ được thực thi tự động theo lịch trình định sẵn. Một số các tác vụ điển hỉnh có thể kể đến như:

  • Bảo trì cơ sở dữ liệu: Tự động sao lưu, tối ưu hóa và dọn dẹp cơ sở dữ liệu định kỳ.
  • Đồng bộ dữ liệu: Lên lịch đồng bộ dữ liệu giữa các hệ thống với nhau.
  • Gửi thông báo: Tự động gửi cảnh báo, báo cáo, hoặc email định kỳ.
  • Theo dõi hệ thống: Kiểm tra tình trạng hoạt động của hệ thống theo khoảng thời gian nhất định.
  • Tự động hóa tác vụ: Hỗ trợ lập trình viên tự động hóa các chức năng, nghiệp vụ vào những khung giờ cụ thể trong ngày.

Để có thể lập lịch và thực thi các tác vụ CronJob có rất nhiều cách khác nhau, điều này tùy thuộc vào hệ điều hành, ngôn ngữ lập trình, công cụ, thư viện mà chúng ta sử dụng. Điểm chung trong tất cả các cách triển khai chính là việc sử dụng cron expression. Vậy cron expression là gì và làm sao để sử dụng nó hiệu quả?

2. Cron Expression

Biểu thức cron (Cron Expression) là một chuỗi ký tự đặc biệt dùng để xác định thời điểm và tần suất thực thi các tác vụ CronJob. Đây là thành phần cốt lõi để lên lịch thực hiện các nhiệm vụ một cách tự động hóa trong nhiều hệ thống. Chúng ta sẽ cùng tìm hiểu cấu trúc của biểu thức cron và một số ví dụ sử dụng trong thực tế.

2.1. Cấu trúc của biểu thức cron

Biểu thức cron gồm 5 đến 7 trường, tùy thuộc vào hệ thống bạn sử dụng. Mỗi trường đại diện cho một đơn vị thời gian, được sắp xếp từ nhỏ nhất (giây) đến lớn nhất (năm, nếu có). Các trường này được phân tách bằng khoảng trắng và có thể chứa bất kỳ giá trị nào được phép.

Cấu trúc của biểu thức cron như sau:

[second] [minute] [hour] [day-of-month] [month] [day-of-week] [year]

Trong đó:

  • Second: Giây thứ S (S ∈ [0, 59])
  • Minute: Phút thứ M (M ∈ [0, 59])
  • Hour: Vào lúc H giờ (H ∈ [0, 23])
  • Day-of-month: Ngày D trong tháng (D ∈ [1, 31])
  • Month: Tháng M
    • M ∈ [1, 12]
    • M ∈ [JAN, DEC] (JAN, FEB, MAR, APR, MAY, JUN, JUL, AUG, SEP, OCT, NOV, DEC)
  • Day-of-week: Thứ T trong tuần
    • T ∈ [0, 7] (0 và 7 là chủ nhật)
    • T ∈ [SUN, SAT] (SUN, MON, TUE, WED, THU, FRI, SAT)
  • Year: Năm Y
    • Y có thể để trống
    • Y ∈ [1970, 2099]

2.2. Các giá trị đặc biệt

Biểu thức cron không chỉ giới hạn ở các giá trị số và chữ đơn giản, mà còn cung cấp một tập hợp các ký tự đặc biệt giúp tăng sự linh hoạt khi lập lịch biểu theo những yêu cầu cụ thể. Việc hiểu rõ và sử dụng hiệu quả các ký tự này có thể giúp bạn tạo ra những lịch biểu phức tạp, đáp ứng nhu cầu từ đơn giản đến nâng cao trong quản lý tác vụ định kỳ.

Dưới đây là danh sách các ký tự đặc biệt phổ biến trong biểu thức cron và cách sử dụng chúng:

  • * (all): Đại diện cho "mọi" giá trị của đơn vị thời gian. Ví dụ: * trong trường [minute] nghĩa là "mỗi phút".
  • - (range): Chỉ định một phạm vi giá trị. Ví dụ: 2-11 trong trường [hour] nghĩa là "từ lúc 2 giờ đến lúc 11 giờ".
  • , (values): Cho phép chỉ định nhiều giá trị. Ví dụ: MON, WED, FRI trong trường [day-of-week] nghĩa là "thứ Hai, thứ Tư và thứ Sáu".
  • / (increments): Xác định các bước nhảy giá trị trong phạm vi. Ví dụ: 5/15 trong trường [minute] nghĩa là "phút thứ 5, 20, 35 và 50 mỗi giờ".
  • #: Chỉ dùng cho trường [day-of-week] để xác định lần thứ n của một thứ trong tháng. Ví dụ 6#4 có nghĩa là chạy vào thứ 7 lần thứ 4 trong tháng. Nếu tháng đó chỉ có 3 thứ 7 thì CronJob sẽ không được chạy.
  • L (last): Chỉ dùng cho trường [day-of-month][day-of-week] để chỉ định ngày cuối cùng của tuần hoặc tháng. Ví dụ:
    • L: Ngày cuối cùng trong tuần hoặc trong tháng.
    • L-3 trong trường [day-of-month] : Ngày thứ 3 của tháng tính từ cuối tháng.
    • 5L trong trường [day-of-week]: Thứ Sáu cuối cùng của tháng.
  • W (weekday): Chỉ dùng cho trường [day-of-month] để chỉ định ngày làm việc (thứ 2 - thứ 6) gần nhất với ngày được cấu hình. Ví dụ:
    • 10: Chạy vào ngày mùng 10 hàng tháng
    • 10W: Chạy vào ngày làm việc gần nhất với ngày mùng 10 hàng tháng
      • Nếu ngày mùng 10 của tháng đó thuộc thứ 2 đến thứ 6 ⇒ CronJob sẽ chạy vào mùng 10.
      • Nếu ngày 10 của tháng đó là thứ 7 ⇒ CronJob sẽ chạy vào mùng 9 (vì thứ 6 gần thứ 7 nhất).
      • Nếu ngày 10 của tháng đó là chủ nhật ⇒ CronJob sẽ chạy vào ngày 11 (vì thứ 2 của tuần sau gần với chủ nhật nhất).
  • ? (any): Chỉ dùng cho trường [day-of-month][day-of-week] có tác dụng là bỏ qua trường nào đó. Ví dụ:
    • 0 0 0 15 5 ?: CronJob sẽ chạy vào ngày 15 của tháng 5 lúc 00:00:00 mà không quan tâm đến thứ mấy.
    • 0 0 0 ? 5 5: CronJob sẽ chạy vào mọi Thứ Sáu của tháng 5 lúc 00:00:00 mà không quan tâm đến ngày trong tháng.

Bảng dưới đây tổng hợp các giá trị và ý nghĩa của từng trường cụ thể, giúp bạn dễ dàng theo dõi và áp dụng vào biểu thức cron một cách hiệu quả hơn.

NameGiá trịÝ nghĩaRequired
second0 - 59
, - * /
Giây thứ SNo
minute0 - 59
, - * /
Phút thứ MYes
hour0 - 23
, - * /
Vào lúc H giờYes
day-of-month1 - 31
,
- * ? / L W
Ngày D trong thángYes
month0 - 11
JAN - DEC
, - * /
Tháng MYes
day-of-week0 - 7
SUN - SAT
, - * ? / L #
Thứ T trong tuầnYes
yearempty
1970 - 2099
, - * /
Năm YNo

2.3. Một số ví dụ về biểu thức cron

Để bạn dễ hình dung hơn về cách sử dụng biểu thức cron, dưới đây là một số ví dụ thực tế. Những ví dụ này sẽ giúp bạn dễ dàng hình dung cách áp dụng cron vào thực tế, từ việc lên lịch chạy tác vụ hàng ngày cho đến những yêu cầu phức tạp hơn.

  • * * * * * ?: Mỗi giây, mỗi phút, mỗi giờ, mỗi ngày, mỗi tháng, bất kỳ ngày nào trong tuần.
  • 0 0 0 * * ?: Mỗi ngày lúc 00:00:00 (nửa đêm).
  • 0/30 * * * * ?: Mỗi 30 giây, mỗi phút, mỗi giờ, mỗi ngày, mỗi tháng.
  • 0 0 12 ? * MON-FRI: Mỗi ngày trong tuần từ thứ Hai đến thứ Sáu lúc 12:00 (trưa).
  • 0 0 0 1 * ?: Vào lúc 00:00 (nửa đêm) vào ngày đầu tiên của mỗi tháng.
  • 0 0 0 15 3 ?: Vào lúc 00:00 (nửa đêm) vào ngày 15 tháng 3 mỗi năm.
  • 0 0 0 1 1 ?: Vào lúc 00:00 (nửa đêm) vào ngày 1 tháng 1 hàng năm (Tết Dương Lịch).
  • 0 15 10 ? * *: Vào lúc 10:15 vào mỗi ngày.
  • 0 0 12 ? * SUN: Vào lúc 12:00 (trưa) mỗi Chủ nhật.
  • 0 0/5 * * * ?: Mỗi 5 phút, bắt đầu từ phút 0 của mỗi giờ.
  • 0 0 0-6 * * ?: Mỗi giờ từ 00:00 đến 06:00 mỗi ngày.
  • 0 0 6,18 * * ?: Vào lúc 06:00 và 18:00 mỗi ngày.
  • 0 0 0 ? * MON#1: Vào lúc 00:00 (nửa đêm) của thứ Hai đầu tiên trong tháng.
  • 0 0 0 ? * 2#2: Vào lúc 00:00 (nửa đêm) của thứ Ba thứ hai trong tháng.
  • 0 0 0 1 * ? 2024: Vào lúc 00:00 (nửa đêm) vào ngày đầu tiên của mỗi tháng trong năm 2024.
  • 0 0 0 1 1 ? 2024: Vào lúc 00:00 (nửa đêm) vào ngày 1 tháng 1 năm 2024.
  • 0 0-5/2 * * * ?: Chạy job tại các thời điểm hh:00:00, hh:02:00, hh:04:00 của mỗi giở.
  • 0 0 0 1-5 * * ?: Vào lúc 00:00 (nửa đêm) từ ngày 1 đến ngày 5 mỗi tháng.
  • 0 0 10 ? * MON-FRI: Vào lúc 10:00 vào mỗi ngày từ thứ Hai đến thứ Sáu.
  • 0 0 12 ? * 1#3: Vào lúc 12:00 (trưa) của thứ Hai lần ba trong tháng.
  • 0 0 0 10W * *: Vào lúc 00:00:00 của ngày làm việc gần nhất với ngày mùng 10 hàng tháng.

3. Cron Expression Tools

Trong phần này, mình sẽ giới thiệu một số công cụ hỗ trợ tạo và kiểm tra biểu thức cron. Công cụ này giúp bạn dễ dàng xây dựng các biểu thức cron chính xác mà không cần phải nhớ tất cả các cú pháp phức tạp. Với sự trợ giúp của công cụ, việc tạo và kiểm tra các biểu thức cron trở nên đơn giản và nhanh chóng hơn bao giờ hết.

3.1. Crontab.guru

Crontab.guru là một công cụ trực tuyến miễn phí, giúp người dùng tạo, kiểm tra và giải thích biểu thức cron một cách nhanh chóng. Với giao diện đơn giản và dễ sử dụng, công cụ này đặc biệt hữu ích cho lập trình viên, quản trị viên hệ thống hoặc bất kỳ ai cần làm việc với biểu thức cron trong các hệ thống Unix/Linux hoặc các dịch vụ hỗ trợ cron.

crontab-guru

Các ưu điểm của Crontab.guru có thể kể đến như:

  • Giao diện đơn giản, trực quan.
  • Giải thích biểu thức cron chi tiết.
  • Xem trước lịch trình, các thời điểm chạy ConJob.
  • Hướng dẫn cú pháp cron.
  • Tương thích với Unix/Linux Crontab.
  • Hoàn toàn miễn phí.

Crontab.guru chỉ hỗ trợ cú pháp cron truyền thống, nên không thể áp dụng cho các biến thể khác như cron Quartz thường sử dụng trong Java. Điều này là một điểm cần lưu ý nếu bạn làm việc với các hệ thống có cú pháp cron mở rộng.

3.2. Cronmaker

Cronmaker là một công cụ trực tuyến miễn phí, hỗ trợ người dùng tạo các biểu thức cron một cách chính xác và nhanh chóng. Công cụ này tương thích với nhiều hệ thống, bao gồm Unix/Linux, Spring Scheduler trong Java, và các dịch vụ tự động hóa như Quartz Scheduler. Với giao diện thân thiện và tính năng trực quan, Cronmaker đơn giản hóa việc thiết lập lịch trình chạy tác vụ phức tạp, trở thành lựa chọn yêu thích của nhiều lập trình viên.

cronmaker

Các tính năng chính của CronMaker:

  • Giao diện đơn giản và trực quan.
  • Tạo biểu thức cron dễ dàng.
  • Kiểm tra và mô phỏng lịch trình.
  • Hỗ trợ Quartz Scheduler.

Tổng kết

Cảm ơn bạn đã đồng hành cùng mình đến cuối bài viết này! Hy vọng rằng những chia sẻ về CronJob và Cron Expression sẽ giúp bạn hiểu rõ hơn và áp dụng thành thạo vào các dự án của mình. Nếu bạn có bất kỳ câu hỏi, ý kiến, hay điều gì muốn chia sẻ, đừng ngần ngại để lại bình luận phía dưới nhé. Chúc bạn có những trải nghiệm học tập thú vị và đừng quên theo dõi những bài viết tiếp theo, nơi chúng ta sẽ tiếp tục khám phá thêm nhiều chủ đề hấp dẫn khác.

Happy reading! 🍻

Tham khảo

  1. Cron expressions | Baeldung
  2. What is cron job | Monovm
  3. Difference between cron, crontab and cronjob | Stackoverflow
Authors
  • Previous Article

  • Next Article

    Published on
    Distributed Lock và Cách Triển Khai với Redis
    Trong các hệ thống phân tán, việc đảm bảo tính nhất quán của dữ liệu (data consistency) và ngăn chặn tranh chấp tài nguyên (race condition) là một thách thức lớn, đặc biệt khi nhiều tiến trình hoặc service truy cập đồng thời vào các tài nguyên dùng chung. Distributed lock là giải pháp hiệu quả để xử lý vấn đề này. Bài viết này mình sẽ giúp bạn hiểu rõ distributed lock là gì, tại sao nó cần thiết, các phương pháp để thực hiện và cách triển khai nó với Redis nhé.
Subscribe to the newsletter