Run a cron job every hour during business hours
0 9-17 * * 1-5
Check it below, then take the line for any of 17 schedulers.
Click to edit · paste a crontab line · hover a field for its values
Every hour, on the hour, from 09:00 to 17:00 on weekdays.
Nothing to watch out for on Debian / Ubuntu cron.
# crontab -e (runs on the server's clock: UTC) 0 9-17 * * 1-5 /path/to/command
· sudo runwisp takeover runs your crontab as it is · How RunWisp compares
Details
Upcoming runs
Calendar 261 days a year
Between two dates
Daylight saving
When things go wrong Server off: Skipped
- Server was off
- Skipped. anacron only catches up cron.daily, weekly and monthly.
- Last run still going
- Starts another copy on top.
- A run fails
- Output is mailed if MAILTO and a mail server work. No output, no mail, whatever the exit code.
- Time zone
- The server's zone. TZ= in a crontab only reaches the command.
- Precision
- 1 minute.
Sources: manpages.debian.org,manpages.debian.org
Other schedulers As written in 10 of 16
- ✓ cronie
0 9-17 * * 1-5vs RunWisp - ✓ BusyBox crond
0 9-17 * * 1-5 - ↻ systemd timer
Mon..Fri *-*-* 09..17:00:00 UTCsystemd timer uses OnCalendar=, not cron lines. vs RunWisp - ✓ RunWisp
0 9-17 * * 1-5 - ✓ Kubernetes CronJob
0 9-17 * * 1-5 - ≠ Ofelia
0 0 9-17 * * 1-5Ofelia puts seconds first, so it reads this as: at :09–:17 past the hour in Jan–May. vs RunWisp - ✓ Dagu
0 9-17 * * 1-5vs RunWisp - ✓ PM2 cron_restart
0 9-17 * * 1-5vs RunWisp - ≠ Jobber
0 0 9-17 * * 1-5Jobber puts seconds first, so it reads this as: at :09–:17 past the hour in Jan–May. vs RunWisp - ✓ GitHub Actions
0 9-17 * * 1-5 - ✓ GitLab CI schedule
0 9-17 * * 1-5 - ↻ AWS EventBridge Scheduler
cron(0 9-17 ? * MON-FRI *)AWS EventBridge Scheduler takes cron() with 6 fields, a year last, and ? in one day field. - ✓ Google Cloud Scheduler
0 9-17 * * 1-5 - ✓ Jenkins
0 9-17 * * 1-5 - ↻ Quartz
0 0 9-17 ? * MON-FRIQuartz takes 6 or 7 fields, seconds first, with ? in one day field. - ↻ Spring @Scheduled
0 0 9-17 * * 1-5Spring @Scheduled takes exactly 6 fields, seconds first.
✓ works as written · ↻ different syntax · ≠ runs at other times · ? not documented · ✗ can't
Every hour during business hours, in every scheduler
Works as written in 11 of 17. Times are UTC; the checker above takes any zone.
- Runs in 2027
- 2,349
- Days with a run
- 261
- Longest gap
- 3 days
| Scheduler | Line | Notes | |
|---|---|---|---|
| Debian / Ubuntu cron | ✓ | 0 9-17 * * 1-5 | Works as written. |
| cronie | ✓ | 0 9-17 * * 1-5 | Works as written. |
| BusyBox crond | ✓ | 0 9-17 * * 1-5 | Works as written. |
| systemd timer | ↻ | OnCalendar=Mon..Fri *-*-* 09..17:00:00 UTC | systemd timer uses OnCalendar=, not cron lines. |
| RunWisp | ✓ | 0 9-17 * * 1-5 | Works as written. |
| Kubernetes CronJob | ✓ | 0 9-17 * * 1-5 | Works as written. |
| Ofelia | ≠ | 0 0 9-17 * * 1-5 | Ofelia puts seconds first, so it reads this as: at :09–:17 past the hour in Jan–May. |
| Dagu | ✓ | 0 9-17 * * 1-5 | Works as written. |
| PM2 cron_restart | ✓ | 0 9-17 * * 1-5 | Works as written. |
| Jobber | ≠ | 0 0 9-17 * * 1-5 | Jobber puts seconds first, so it reads this as: at :09–:17 past the hour in Jan–May. |
| GitHub Actions | ✓ | 0 9-17 * * 1-5 | Works as written. |
| GitLab CI schedule | ✓ | 0 9-17 * * 1-5 | Works as written. |
| AWS EventBridge Scheduler | ↻ | cron(0 9-17 ? * MON-FRI *) | AWS EventBridge Scheduler takes cron() with 6 fields, a year last, and ? in one day field. |
| Google Cloud Scheduler | ✓ | 0 9-17 * * 1-5 | Works as written. |
| Jenkins | ✓ | 0 9-17 * * 1-5 | Works as written. |
| Quartz | ↻ | 0 0 9-17 ? * MON-FRI | Quartz takes 6 or 7 fields, seconds first, with ? in one day field. |
| Spring @Scheduled | ↻ | 0 0 9-17 * * 1-5 | Spring @Scheduled takes exactly 6 fields, seconds first. |
✓ works as written · ↻ different syntax · ≠ runs at other times · ? not documented · ✗ can't
Cron runs the line. Nobody tells you how it went.
RunWisp is an open-source cron replacement that ships as a single binary. It reads the same cron line and keeps a record of every run: output, exit code, duration.
# crontab -e (runs on the server's clock: UTC)
0 9-17 * * 1-5 /usr/local/bin/job.sh [tasks.job]
cron = "0 9-17 * * 1-5"
timezone = "UTC"
run = '/usr/local/bin/job.sh' | cron | RunWisp | |
|---|---|---|
| The server was off at run time | Skipped. anacron only catches up cron.daily, weekly and monthly. | Runs the most recent missed run at start-up (catch_up = 1) and sends a missed-run alert. |
| The last run is still going | Starts another copy on top. | Queues it. on_overlap = "queue" is the default. |
| A run fails | Output is mailed if MAILTO and a mail server work. No output, no mail, whatever the exit code. | Marked failed and sent to your alert channels. retry_attempts adds retries. |
Keep your crontab. sudo runwisp takeover runs it where it is and retires cron,
crontab -e keeps working, and runwisp service uninstall puts cron
back. It needs Linux with systemd; elsewhere, runwisp import cron converts the
file. RunWisp doesn't do L, W or #, and it runs
on one machine, not a cluster.
Moving from cron →
Questions
What does 0 9-17 * * 1-5 mean?
How do I run a job every hour during business hours with a systemd timer?
OnCalendar=Mon..Fri *-*-* 09..17:00:00 UTC. systemd timer uses OnCalendar=, not cron lines.How do I run a job every hour during business hours in a Kubernetes CronJob?
0 9-17 * * 1-5 works as written.How do I run a job every hour during business hours in GitHub Actions?
0 9-17 * * 1-5 works as written.How do I run a job every hour during business hours on AWS EventBridge?
cron(0 9-17 ? * MON-FRI *). AWS EventBridge Scheduler takes cron() with 6 fields, a year last, and ? in one day field.Start in 30 seconds. Ship on your terms.
A single Go binary. If it doesn't earn the disk space, rm it. No account, no signup, no catch.
curl -fsSL https://get.runwisp.com | sh