Run a job every 30 minutes
The cron expression for every 30 minutes is */30 * * * *. The */30 step in the minute field fires at :00 and :30, twice an hour and 48 times a day.
crontab syntax · 5 fields
*/30****Next 5 runs
Vercel always runs schedules in UTC, and GitHub Actions does unless you set a time zone. Crontab and Kubernetes use the server's time zone.
Field by field
*/30Minute- Every 30th minute: 0, 30
*Hour- Every hour, 0 to 23
*Day of month- Every day of the month
*Month- Every month
*Day of week- Every day of the week
By platform
Most schedulers take the same five fields. The wrapper, time zone and limits differ.
crontab -e
# m h dom mon dow command
*/30 * * * * /usr/local/bin/sync.sh >> /var/log/sync.log 2>&1Runs in the server's local time zone
Cron starts jobs with a minimal environment: use absolute paths, and send output to a log so failures don't disappear.
.github/workflows/sync.yml
on:
schedule:
- cron: "*/30 * * * *"Runs in UTC unless you set a time zone
Add
timezone next to cron to use local time. Runs often start late when GitHub is busy, most of all at the start of an hour. In a public repository, GitHub turns the schedule off after 60 days without activity.cronjob.yaml (excerpt)
spec:
schedule: "*/30 * * * *"
timeZone: "Etc/UTC"
concurrencyPolicy: ForbidWithout timeZone, the controller's zone applies
Set timeZone to pin the schedule. concurrencyPolicy: Forbid stops a slow run from overlapping the next one.
AWS CLI
aws events put-rule \
--name sync-every-30-minutes \
--schedule-expression "cron(0/30 * * * ? *)"Six fields, and one day field must be ?
EventBridge adds a year at the end and needs
? in day-of-month or day-of-week. For a plain interval, rate(30 minutes) is simpler, though its runs are timed from when you create the rule rather than by the clock.vercel.json
{
"crons": [
{ "path": "/api/sync", "schedule": "*/30 * * * *" }
]
}Needs a paid plan
On Hobby, cron jobs run at most once a day, so this schedule fails at deploy time. Vercel runs crons in UTC.
Other 30-minute schedules
Change the starting minute to move runs off the hour and half hour, or narrow the hour and weekday fields.
| Expression | Runs |
|---|---|
0,30 * * * * | Same as */30 * * * *, with the minutes listed |
15,45 * * * * | Every 30 minutes at :15 and :45 |
*/30 9-17 * * 1-5 | Every 30 minutes from 09:00 through 17:30, Monday through Friday (the hour range includes 17:30) |
30 * * * * | Once an hour at half past, not every 30 minutes |