Run a cron job every 90 minutes
@every 90m
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 1h30m, counted from when the scheduler starts.
Nothing to watch out for on RunWisp.
[tasks.job] cron = "@every 90m" timezone = "UTC" run = '/path/to/command'
Details
Upcoming runs
Calendar Every day
Between two dates
Daylight saving
Not tied to the wall clock, so clock changes don't move it.
When things go wrong Server off: Runs the most recent missed run at start-up (catch_up = 1) and sends a missed-run alert
- Server was off
- Runs the most recent missed run at start-up (catch_up = 1) and sends a missed-run alert.
- Last run still going
- Queues it. on_overlap = "queue" is the default.
- A run fails
- Marked failed and sent to your alert channels. retry_attempts adds retries.
- Time zone
- Per task (timezone =), else the daemon's, else the host's.
- Precision
- 1 second, with the optional seconds field.
Sources: docs.runwisp.com,docs.runwisp.com
Other schedulers As written in 3 of 16
- ↻ Debian / Ubuntu cron
0 */3 * * * 30 1-22/3 * * *Debian / Ubuntu cron has no @every. vs RunWisp - ↻ cronie
0 */3 * * * 30 1-22/3 * * *cronie has no @every. vs RunWisp - ↻ BusyBox crond
0 */3 * * * 30 1-22/3 * * *BusyBox crond has no @every. - ↻ systemd timer
OnBootSec=1h30min OnUnitActiveSec=1h30minsystemd timer has no @every. vs RunWisp - ✓ Kubernetes CronJob
@every 90m - ✓ Ofelia
@every 90mvs RunWisp - ✓ Dagu
@every 90mvs RunWisp - ↻ PM2 cron_restart
0 */3 * * * 30 1-22/3 * * *PM2 cron_restart has no @every. vs RunWisp - ↻ Jobber
0 0 */3 * * * 0 30 1-22/3 * * *Jobber has no @every. vs RunWisp - ↻ GitHub Actions
0 */3 * * * 30 1-22/3 * * *GitHub Actions has no @every. - ↻ GitLab CI schedule
0 */3 * * * 30 1-22/3 * * *GitLab CI schedule has no @every. - ↻ AWS EventBridge Scheduler
rate(90 minutes)AWS EventBridge Scheduler has no @every. - ↻ Google Cloud Scheduler
0 */3 * * * 30 1-22/3 * * *Google Cloud Scheduler has no @every. - ↻ Jenkins
0 */3 * * * 30 1-22/3 * * *Jenkins has no @every. - ↻ Quartz
0 0 */3 * * ? 0 30 1-22/3 * * ?Quartz has no @every. - ↻ Spring @Scheduled
0 0 */3 * * * 0 30 1-22/3 * * *Spring @Scheduled has no @every.
✓ works as written · ↻ different syntax · ≠ runs at other times · ? not documented · ✗ can't
Every 90 minutes, in every scheduler
Works as written in 4 of 17. Times are UTC; the checker above takes any zone.
Cron steps start over every hour and every day, so 90 minutes doesn't fit in one crontab line. It takes two, one for the full hours and one for the half hours.
| Scheduler | Line | Notes | |
|---|---|---|---|
| Debian / Ubuntu cron | ↻ | 0 */3 * * *30 1-22/3 * * * | Debian / Ubuntu cron has no @every. Lines up with the clock instead of counting from start-up. |
| cronie | ↻ | 0 */3 * * *30 1-22/3 * * * | cronie has no @every. Lines up with the clock instead of counting from start-up. |
| BusyBox crond | ↻ | 0 */3 * * *30 1-22/3 * * * | BusyBox crond has no @every. Lines up with the clock instead of counting from start-up. |
| systemd timer | ↻ | OnBootSec=1h30minOnUnitActiveSec=1h30min | systemd timer has no @every. Counts from the last run, like @every. |
| RunWisp | ✓ | @every 90m | Works as written. |
| Kubernetes CronJob | ✓ | @every 90m | Works as written. |
| Ofelia | ✓ | @every 90m | Works as written. |
| Dagu | ✓ | @every 90m | Works as written. |
| PM2 cron_restart | ↻ | 0 */3 * * *30 1-22/3 * * * | PM2 cron_restart has no @every. Lines up with the clock instead of counting from start-up. |
| Jobber | ↻ | 0 0 */3 * * *0 30 1-22/3 * * * | Jobber has no @every. Lines up with the clock instead of counting from start-up. |
| GitHub Actions | ↻ | 0 */3 * * *30 1-22/3 * * * | GitHub Actions has no @every. Lines up with the clock instead of counting from start-up. |
| GitLab CI schedule | ↻ | 0 */3 * * *30 1-22/3 * * * | GitLab CI schedule has no @every. Lines up with the clock instead of counting from start-up. |
| AWS EventBridge Scheduler | ↻ | rate(90 minutes) | AWS EventBridge Scheduler has no @every. |
| Google Cloud Scheduler | ↻ | 0 */3 * * *30 1-22/3 * * * | Google Cloud Scheduler has no @every. Lines up with the clock instead of counting from start-up. |
| Jenkins | ↻ | 0 */3 * * *30 1-22/3 * * * | Jenkins has no @every. Lines up with the clock instead of counting from start-up. |
| Quartz | ↻ | 0 0 */3 * * ?0 30 1-22/3 * * ? | Quartz has no @every. Lines up with the clock instead of counting from start-up. |
| Spring @Scheduled | ↻ | 0 0 */3 * * *0 30 1-22/3 * * * | Spring @Scheduled has no @every. Lines up with the clock instead of counting from start-up. |
✓ 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 */3 * * * /usr/local/bin/job.sh
30 1-22/3 * * * /usr/local/bin/job.sh [tasks.job]
cron = "@every 90m"
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 @every 90m mean?
How do I run a job every 90 minutes in a crontab?
0 */3 * * * and 30 1-22/3 * * *. Debian / Ubuntu cron has no @every. Lines up with the clock instead of counting from start-up.How do I run a job every 90 minutes with a systemd timer?
OnBootSec=1h30min and OnUnitActiveSec=1h30min. systemd timer has no @every. Counts from the last run, like @every.How do I run a job every 90 minutes in a Kubernetes CronJob?
@every 90m works as written.How do I run a job every 90 minutes in GitHub Actions?
0 */3 * * * and 30 1-22/3 * * *. GitHub Actions has no @every. Lines up with the clock instead of counting from start-up.How do I run a job every 90 minutes on AWS EventBridge?
rate(90 minutes). AWS EventBridge Scheduler has no @every.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