Cron: Every 2 Minutes
*/2 * * * * uses cron's step syntax — the /2 means "every 2nd value" within the minute field's full range (0–59), so the job fires at :00, :02, :04, and so on. It's a common middle ground when every-minute is too aggressive but a 5-minute gap feels too slow.
*/2 * * * *
Examples & Variations
Common Mistakes
- Assuming */2 starts counting from whenever the job was deployed — it doesn't. Step values always align to the field's start (minute 0), not to deploy time.
- Confusing */2 in the minute field with "every 2 hours" — that requires putting the /2 in the hour field instead: 0 */2 * * *.
- Not accounting for clock drift on self-hosted cron daemons, which can cause a run to be skipped entirely if the system clock jumps.
Best Practices
- Use */2 for lightweight sync jobs — anything heavier tends to benefit more from an explicit queue than tighter polling.
- If you need an offset (e.g. starting at minute 1 instead of 0), use a range with a step like 1-59/2 rather than assuming an implicit offset.
- Pair with the same overlap protection you'd use for every-minute jobs — a 2-minute window is still tight for anything with variable runtime.
Frequently Asked Questions
- How does the */2 step syntax actually work?
- The number after the slash is a step size applied to the field's full range. In the minute field (0–59), */2 expands to 0,2,4,6,...,58 — every second value starting from the field's minimum.
- Is */2 * * * * the same as 0,2,4,6,... * * * *?
- Yes, functionally identical. The step syntax is just a shorthand for an explicit comma-separated list covering every 2nd minute.
- What if I want every 2 minutes starting at :01 instead of :00?
- Use 1-59/2 * * * * — this restricts the step to the range starting at minute 1, producing :01, :03, :05, and so on.