Trình Phân Tích Biểu Thức Cron
Phân tích biểu thức cron thành mô tả dễ đọc và xem trước các lần chạy tiếp theo
Biểu thức cron
minute hour day(month) month day(week)
Mô tả dễ đọc
At 9:00 AM, Mon, Tue, Wed, Thu, Fri
Phân tích từng trường
Minute
0
0–59
Hour
9
0–23
Day (month)
*
1–31
Month
*
1–12
Day (week)
1-5
0–6
10 lần chạy tiếp theo
Phân Tích Biểu Thức Cron Là Gì?
Biểu thức cron là một chuỗi gồm năm trường cách nhau bằng dấu cách, dùng để định nghĩa lịch chạy định kỳ. Định dạng này bắt nguồn từ Unix cron daemon, lần đầu được viết bởi Ken Thompson cho Version 7 Unix vào năm 1979. Mỗi trường đại diện cho một đơn vị thời gian: phút, giờ, ngày trong tháng, tháng và ngày trong tuần. Phân tích biểu thức cron nghĩa là chuyển đổi ký hiệu rút gọn này thành mô tả dễ đọc và danh sách cụ thể các thời điểm thực thi sắp tới.
Định dạng năm trường tiêu chuẩn được sử dụng bởi crontab trên Linux và macOS, bởi các nền tảng CI/CD như GitHub Actions và GitLab CI, bởi các bộ lập lịch đám mây trong AWS (EventBridge), Google Cloud Scheduler và Azure Functions, và bởi các thư viện lập lịch tác vụ trong mọi ngôn ngữ lập trình phổ biến. Một số hệ thống mở rộng định dạng lên sáu hoặc bảy trường bằng cách thêm trường giây hoặc trường năm, nhưng bố cục năm trường theo POSIX vẫn là nền tảng chung mà tất cả các triển khai đều chia sẻ.
Phân tích biểu thức cron bằng tay rất dễ mắc lỗi. Sự tương tác giữa các trường tạo ra các lịch không trực quan: 0 9 1-7 * 1 không có nghĩa là 'mỗi thứ Hai trong tuần đầu tiên' mà là 'từ ngày 1 đến ngày 7 hàng tháng HOẶC bất kỳ ngày thứ Hai nào.' Một trình phân tích cron loại bỏ sự nhập nhằng này bằng cách khai triển từng trường, áp dụng các quy tắc kết hợp và tạo ra các mốc thời gian thực tế khi tác vụ sẽ được kích hoạt.
Tại Sao Dùng Trình Phân Tích Cron Này?
Đọc biểu thức cron như 30 */6 1,15 * * từ tệp cấu hình và biết chính xác thời điểm nó chạy đòi hỏi phải tính toán qua năm trường. Trình phân tích này thực hiện công việc đó ngay lập tức.
Các Trường Hợp Sử Dụng Trình Phân Tích Cron
Tài Liệu Tham Khảo Cú Pháp Biểu Thức Cron
Biểu thức cron tiêu chuẩn có năm trường cách nhau bằng dấu cách. Mỗi trường chấp nhận số nguyên, ký tự đại diện, phạm vi, danh sách và giá trị bước. Bảng dưới đây hiển thị phạm vi cho phép và toán tử cho từng trường.
| Trường | Phạm vi | Toán tử | Mô tả |
|---|---|---|---|
| Minute | 0–59 | * , - / | Minute within the hour |
| Hour | 0–23 | * , - / | Hour of the day (24-hour) |
| Day (month) | 1–31 | * , - / | Day of the month |
| Month | 1–12 | * , - / | Month of the year (or JAN–DEC) |
| Day (week) | 0–6 | * , - / | Day of the week (0 = Sunday, or SUN–SAT) |
Bốn ký tự đặc biệt kiểm soát cách so khớp giá trị trong từng trường:
| Ký tự | Tên | Hành vi |
|---|---|---|
| * | Wildcard | Matches every possible value in the field. * in the minute field means "every minute." |
| , | List | Separates individual values. 1,15 in the day field means "the 1st and 15th." |
| - | Range | Defines an inclusive range. 1-5 in the day-of-week field means "Monday through Friday." |
| / | Step | Defines an interval. */10 in the minute field means "every 10 minutes." 5/15 means "5, 20, 35, 50." |
Dưới đây là các biểu thức cron phổ biến đáp ứng hầu hết các nhu cầu lập lịch:
| Biểu thức | Lịch |
|---|---|
| * * * * * | Every minute |
| 0 * * * * | Every hour (at minute 0) |
| */15 * * * * | Every 15 minutes |
| 0 9 * * * | Every day at 9:00 AM |
| 0 9 * * 1-5 | Weekdays at 9:00 AM |
| 30 2 * * 0 | Every Sunday at 2:30 AM |
| 0 0 1 * * | First day of every month at midnight |
| 0 0 * * 1 | Every Monday at midnight |
| 0 0 1 1 * | January 1st at midnight (yearly) |
| 0 */6 * * * | Every 6 hours |
| 5,35 * * * * | At minute 5 and 35 of every hour |
| 0 9-17 * * 1-5 | Every hour from 9 AM to 5 PM, weekdays |
Ví Dụ Code
Cách phân tích biểu thức cron và tính toán thời gian chạy tiếp theo trong các ngôn ngữ phổ biến:
import cronstrue from 'cronstrue';
// Parse cron to human-readable text
cronstrue.toString('0 9 * * 1-5');
// → "At 09:00 AM, Monday through Friday"
cronstrue.toString('*/15 * * * *');
// → "Every 15 minutes"
// Validate with cron-parser and get next run times
import { parseExpression } from 'cron-parser';
const interval = parseExpression('30 2 * * 0');
console.log(interval.next().toISOString());
// → next Sunday at 02:30 UTC
// Iterate over the next 5 runs
for (let i = 0; i < 5; i++) {
console.log(interval.next().toString());
}from crontab import CronTab
from croniter import croniter
from datetime import datetime
# Parse and describe a cron expression
cron = CronTab('0 9 * * 1-5')
print(cron.next(default_utc=True))
# → seconds until next run
# Get the next 5 run times with croniter
base = datetime.now()
cron_iter = croniter('0 9 * * 1-5', base)
for _ in range(5):
print(cron_iter.get_next(datetime))
# → next 5 weekday 09:00 timestamps
# Check if a specific time matches
print(croniter.match('*/15 * * * *', datetime(2026, 3, 25, 10, 30)))
# → True (minute 30 is divisible by 15)package main
import (
"fmt"
"time"
"github.com/robfig/cron/v3"
)
func main() {
// Parse a standard 5-field cron expression
parser := cron.NewParser(cron.Minute | cron.Hour | cron.Dom | cron.Month | cron.Dow)
schedule, err := parser.Parse("0 9 * * 1-5")
if err != nil {
panic(err)
}
// Calculate the next 5 run times
now := time.Now()
for i := 0; i < 5; i++ {
now = schedule.Next(now)
fmt.Println(now)
}
// → next 5 weekday 09:00 timestamps
}# List current user's cron jobs crontab -l # Edit cron jobs interactively crontab -e # Add a job: run backup.sh every day at 2:30 AM # (append to crontab via pipe) (crontab -l 2>/dev/null; echo "30 2 * * * /home/user/backup.sh") | crontab - # Check syntax with a dry-run parse (requires cronie or busybox) # The system will reject invalid expressions when saving # View cron logs on systemd-based Linux journalctl -u cron --since "1 hour ago"