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.
- 012026-08-19T14:17:12.000Z
- 022026-08-19T14:17:13.000Z
- 032026-08-19T14:17:14.000Z
- 042026-08-19T14:17:15.000Z
- 052026-08-19T14:17:16.000Z
- 062026-08-19T14:17:17.000Z
- 072026-08-19T14:17:18.000Z
- 082026-08-19T14:17:19.000Z
- 092026-08-19T14:17:20.000Z
- 102026-08-19T14:17:21.000Z
Variations
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:
- Spring
@Scheduled(cron = "* * * * * *")— see the Spring cron reference and the Spring@Scheduledguide. - Quartz
* * * * * ?— see the Quartz cron reference.
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?
Can crontab run a command every second?
Why does `* * * * *` not run every second?
Is running a cron job every second a bad idea?
What's the fastest interval Kubernetes CronJob supports?
More seconds schedules
Other patterns on the same cadence — or browse every schedule.