Skip to main content

Cron expressions

Reqon supports full cron expression syntax for precise scheduling.

Syntax​

schedule: cron "minute hour day month weekday"

Field reference​

FieldValuesSpecial Characters
Minute0-59* , - /
Hour0-23* , - /
Day of Month1-31* , - /
Month1-12* , - /
Day of Week0-6 (0=Sunday)* , - /

Special characters​

CharacterMeaningExample
*Any value* * * * * = every minute
,Value list0,30 * * * * = minute 0 and 30
-Range0 9-17 * * * = 9am to 5pm
/Step*/15 * * * * = every 15 minutes

Common patterns​

Every minute​

schedule: cron "* * * * *"

Every hour​

// At minute 0
schedule: cron "0 * * * *"

Every N minutes​

// Every 5 minutes
schedule: cron "*/5 * * * *"

// Every 15 minutes
schedule: cron "*/15 * * * *"

// Every 30 minutes
schedule: cron "*/30 * * * *"

Every N hours​

// Every 2 hours
schedule: cron "0 */2 * * *"

// Every 6 hours
schedule: cron "0 */6 * * *"

// Every 12 hours
schedule: cron "0 */12 * * *"

Daily​

// At midnight
schedule: cron "0 0 * * *"

// At 6am
schedule: cron "0 6 * * *"

// At 9am
schedule: cron "0 9 * * *"

// At 11pm
schedule: cron "0 23 * * *"

Multiple times per day​

// At 9am and 5pm
schedule: cron "0 9,17 * * *"

// At midnight, 8am, 4pm
schedule: cron "0 0,8,16 * * *"

Weekly​

// Every Sunday at midnight
schedule: cron "0 0 * * 0"

// Every Monday at 9am
schedule: cron "0 9 * * 1"

// Every Friday at 5pm
schedule: cron "0 17 * * 5"

Weekdays only​

// Weekdays at 9am
schedule: cron "0 9 * * 1-5"

// Weekdays every hour during business hours
schedule: cron "0 9-17 * * 1-5"

Weekends only​

// Weekends at noon
schedule: cron "0 12 * * 0,6"

Monthly​

// First of month at midnight
schedule: cron "0 0 1 * *"

// First of month at 6am
schedule: cron "0 6 1 * *"

// 15th of month at noon
schedule: cron "0 12 15 * *"

// Last day approach: run on 28th
schedule: cron "0 0 28 * *"

Quarterly​

// First day of quarter at 6am
schedule: cron "0 6 1 1,4,7,10 *"

Yearly​

// January 1st at midnight
schedule: cron "0 0 1 1 *"

// First Monday of year (approximate)
schedule: cron "0 9 1-7 1 1"

Complex examples​

Business hours only​

// Every 30 minutes, 9am-5pm, weekdays
schedule: cron "*/30 9-17 * * 1-5"

Night batch jobs​

// At 2am every day
schedule: cron "0 2 * * *"

Multiple specific times​

// 8am, 12pm, 6pm every day
schedule: cron "0 8,12,18 * * *"

End of month (approximation)​

// 28th of every month
schedule: cron "0 0 28 * *"

Timezone handling​

Cron expressions use the system timezone by default.

Specify timezone​

timezone is a schedule option, so it goes inside the schedule's { } block:

mission TimezoneSync {
schedule: cron "0 9 * * *" {
timezone: "America/New_York"
}
}

UTC​

mission UTCSync {
schedule: cron "0 9 * * *" {
timezone: "UTC"
}
}

Previewing run times​

Start the daemon and it prints each scheduled mission's next run time on startup:

reqon ./missions/ --daemon
# Scheduled jobs:
# - TimezoneSync: cron "0 9 * * *"
# Next run: 2024-01-20T09:00:00.000Z

A malformed cron expression fails when the mission is loaded, so an invalid schedule surfaces as soon as you run the file.

Best practices​

Avoid midnight​

Many systems run jobs at midnight, causing load spikes:

// Instead of 0 0 * * *
schedule: cron "0 3 * * *" // 3am

Spread load​

Stagger related jobs:

mission SyncCustomers {
schedule: cron "0 * * * *" // On the hour
}

mission SyncOrders {
schedule: cron "15 * * * *" // 15 past
}

mission SyncProducts {
schedule: cron "30 * * * *" // 30 past
}

Consider execution time​

Account for job duration:

// If a job takes 10 minutes, don't schedule every 5
schedule: cron "*/15 * * * *" { // Every 15 minutes
skipIfRunning: true // Or skip overlapping runs
}

Troubleshooting​

Wrong times​

Check timezone settings:

date # System time
TZ=UTC date # UTC time

Missed runs​

If the daemon was down, jobs don't backfill. Consider retrying failed runs with the schedule's retry block:

schedule: cron "0 9 * * *" {
retry: { maxRetries: 3, delaySeconds: 60 }
}

Expression errors​

A malformed cron expression fails when the mission loads, with an error naming the bad expression. Fix the expression and run the file again.