cronuru
Pattern

Every Second

* * * * * *
* * * * * ?

Runs every second — the fastest a cron parser will schedule. Requires a seconds-aware dialect; standard Unix cron is minute-precision only.

Use in your stack

# The sleep-offset trick does not scale here: every second would be
# SIXTY crontab entries. One per-minute entry driving a loop is the
# only sane crontab form.
* * * * * for i in $(seq 60); do /usr/local/bin/tick.sh & sleep 1; done

# But at 1 Hz you want a long-lived process, not a scheduler.
# A systemd service with an internal ticker, or a monotonic timer:
#   /etc/systemd/system/tick.timer
#   [Timer]
#   OnUnitActiveSec=1s
#   AccuracySec=1s          # defaults to 1min — 60x too coarse here
#
# Note OnUnitActiveSec measures from the END of the last run, so a
# slow job stretches the interval instead of stacking invocations.
{
  "schedule": {
    "cron": "* * * * * ?",
    "timezone": "UTC"
  }
}
// 6-field: second minute hour day-of-month month day-of-week
@Scheduled(cron = "* * * * * *")
public void everySecond() {
    // ...
}

// Better at this cadence — waits for the previous run to finish:
@Scheduled(fixedDelay = 1000) // milliseconds
public void everySecondNoOverlap() {
    // ...
}

Next runs

Pick a timezone to see when this expression fires next.

Next 10 runs
  1. 012026-08-19T14:17:12.000Z
  2. 022026-08-19T14:17:13.000Z
  3. 032026-08-19T14:17:14.000Z
  4. 042026-08-19T14:17:15.000Z
  5. 052026-08-19T14:17:16.000Z
  6. 062026-08-19T14:17:17.000Z
  7. 072026-08-19T14:17:18.000Z
  8. 082026-08-19T14:17:19.000Z
  9. 092026-08-19T14:17:20.000Z
  10. 102026-08-19T14:17:21.000Z

Variations

*/5 * * * * *

Every 5 seconds

*/10 * * * * *

Every 10 seconds

* * * * *

Every minute (Unix — the standard-cron floor)

Common use cases

  • Driving a live development dashboard or local debug readout.
  • Tailing a high-throughput queue where one second of latency is the budget.
  • Emitting a heartbeat or liveness tick to a monitoring system.
  • Polling a hardware sensor or serial device on a tight loop.

Gotchas

  • **Unix crontab cannot do this.** The 5-field format has no seconds field; its minimum is `* * * * *` (every minute). Kubernetes CronJob, AWS EventBridge and Cloudflare Workers inherit the same one-minute floor, and GitHub Actions floors at five minutes.
  • **A systemd timer needs `AccuracySec=1s` — and even then, prefer `OnUnitActiveSec=1s` over `OnCalendar`.** `AccuracySec` defaults to **1 minute**, which is 60× too coarse to express this at all. `OnUnitActiveSec` also measures from the end of the previous run, so a slow job stretches the gap rather than stacking invocations.
  • **Overlap is near-certain at this cadence.** If the job ever takes longer than one second, runs stack up and pile on. Prefer `fixedDelay` (waits for the previous run to finish) over `fixedRate`, or guard with an in-flight lock.
  • In Spring, `* * * * * *` is the 6-field form (seconds first). The 5-field Unix `* * * * *` means every *minute* — the difference is one asterisk and 60× the frequency.
  • In Quartz, use `* * * * * ?` — the `?` fills the unused day-of-week field, since Quartz forbids specifying both day-of-month and day-of-week.
  • **A cron parser is real overhead at 1 Hz.** Re-evaluating an expression every second to decide "yes, now" is wasted work compared to `tokio::time::interval(Duration::from_secs(1))` or `setInterval(fn, 1000)`, which just sleep.
  • Per-second cron is a strong signal you want a long-lived worker process, not a scheduler. If each firing spawns a process or container, the startup cost will dominate the actual work.

Standard cron — /etc/crontab, Kubernetes CronJobs, GitHub Actions — has five fields starting at minutes. There is no seconds field, so “every second” isn’t expressible at all. The finest standard cron schedules is once a minute.

On Linux, the offset trick is off the table

At 30 seconds you write two crontab entries. At one second you would write sixty — so the only sane crontab form is a single per-minute entry driving a loop:

* * * * * for i in $(seq 60); do /usr/local/bin/tick.sh & sleep 1; done

That works, but notice what you’ve built: a daemon, declared inside a config file, restarted from scratch every minute. If the box has systemd, run it as an actual service — or use a monotonic timer with OnUnitActiveSec=1s and AccuracySec=1s. AccuracySec defaults to 1 minute, which is 60× too coarse to express this at all, and OnUnitActiveSec measures from the end of the last run, so a slow job stretches the gap instead of stacking. See systemd timers.

Or use a dialect that has seconds

A 6-field, seconds-first dialect will do it:

But one second is where cron stops earning its keep. A cron expression exists to describe alignment to the wall clock — “at 03:15 on the first of the month.” At 1 Hz there is nothing to align to: every instant matches. You’re paying for a parser to tell you “yes” sixty times a minute.

Use an interval timer instead. setInterval(fn, 1000) in Node, tokio::time::interval(Duration::from_secs(1)) in Rust, @Scheduled(fixedDelay = 1000) in Spring. Each is fewer moving parts than a cron string, and — critically at this cadence — fixedDelay semantics stop runs from stacking when one takes longer than a second.

For the full picture of which runtimes can go sub-minute and what their real floors are, see sub-minute scheduling.

Frequently asked questions

What is the cron expression for every second?
In a seconds-aware dialect it's `* * * * * *` (Spring, node-cron, tokio-cron-scheduler) or `* * * * * ?` (Quartz). Standard Unix crontab has no seconds field and cannot express it at all — its finest granularity is one minute (`* * * * *`).
Can crontab run a command every second?
No. The 5-field crontab format starts at minutes, so one minute is the hard floor. The nearest workaround is a per-minute entry that runs an internal loop — `* * * * * for i in $(seq 60); do /path/to/job; sleep 1; done` — but at that point you have written a daemon inside a crontab line. Run a proper long-lived process under systemd instead.
Why does `* * * * *` not run every second?
Because its first field is minutes, not seconds. `* * * * *` is the 5-field Unix expression meaning "every minute." Every second needs a sixth, leading seconds field: `* * * * * *`. Miscounting the fields between these two dialects is the most common cron bug there is, and it fails silently — the job runs, just 60× less often than you intended.
Is running a cron job every second a bad idea?
Usually, yes — not because one-second work is wrong, but because cron is the wrong shape for it. A cron expression describes wall-clock alignment, which is meaningless at 1 Hz, and re-parsing it every second is pure overhead. Use an interval timer in a long-lived process: `setInterval(fn, 1000)`, `tokio::time::interval`, or `@Scheduled(fixedDelay = 1000)`. You get the same cadence with less machinery and explicit control over overlap.
What's the fastest interval Kubernetes CronJob supports?
One minute. Kubernetes CronJob uses the standard 5-field format and has no sub-minute option. Even if it did, spawning a pod every second would cost far more in scheduling and image-pull overhead than the job itself. For per-second work in Kubernetes, run a Deployment with an internal ticker.

More seconds schedules

Other patterns on the same cadence — or browse every schedule.