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.

runwisp.toml
[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=1h30min systemd timer has no @every. vs RunWisp
  • ✓ Kubernetes CronJob @every 90m
  • ✓ Ofelia @every 90m vs RunWisp
  • ✓ Dagu @every 90m vs 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

Schedulers

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.

SchedulerLineNotes
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

RunWisp

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
# 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
runwisp.toml
[tasks.job]
cron     = "@every 90m"
timezone = "UTC"
run      = '/usr/local/bin/job.sh'
cronRunWisp
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 →

FAQ

Questions

What does @every 90m mean?
Every 1h30m, counted from when the scheduler starts. Times are in the scheduler's time zone, usually the server's.
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.
More
Get started
GPL 3.0 · no accounts · free to self-host

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.

Install in 30 seconds
curl -fsSL https://get.runwisp.com | sh