Cron Job Every 2 Days at Midnight – 0 0 */2 * *
The expression 0 0 */2 * * triggers at 00:00 on every 2nd day-of-month, starting from day 1 — so it fires on days 1, 3, 5, 7, and so on. Because it steps through the day-of-month field (1–31) rather than tracking elapsed time, the last interval of a month may be shorter than 2 days: in a 31-day month the final fire is on day 31, followed immediately by another on day 1 of the next month, giving a gap of just 1 day. If a strict 48-hour cadence is required regardless of month boundaries, consider using a dedicated scheduler like CronJobPro with interval-based scheduling instead.
How It Works
The expression 0 0 */2 * * triggers at 00:00 on every 2nd day-of-month, starting from day 1 — so it fires on days 1, 3, 5, 7, and so on. Because it steps through the day-of-month field (1–31) rather than tracking elapsed time, the last interval of a month may be shorter than 2 days: in a 31-day month the final fire is on day 31, followed immediately by another on day 1 of the next month, giving a gap of just 1 day. If a strict 48-hour cadence is required regardless of month boundaries, consider using a dedicated scheduler like CronJobPro with interval-based scheduling instead.
Common Use Cases
- Regenerate and cache a heavy analytics or reporting dataset that does not need daily freshness but must be ready for business reviews every other day.
- Run a database VACUUM, index rebuild, or statistics update on a moderate-traffic application where nightly runs would be too frequent and weekly too stale.
- Poll a third-party API for updated pricing, inventory, or exchange-rate data and sync changes to a local datastore on a 2-day cadence to stay within rate limits.
- Send a digest email or push notification to users summarising their activity or pending actions from the past 48 hours without overwhelming them with daily messages.
Monitor a Job on This Schedule
Writing the 0 0 */2 * * schedule is only half the job. Cron fires silently — if the run is skipped, the server is down, or the script fails, nothing tells you. A heartbeat monitor closes that gap: your job pings a URL on success, and you get an alert the moment an expected run goes missing. CronJobPro can run this schedule for you as an HTTP job, or watch a job you run elsewhere (cron, CI, Kubernetes) with a dead-man's-switch check.
Schedule This Cron Job Now
Create a free CronJobPro account and use 0 0 */2 * * to schedule HTTP requests automatically — with monitoring, retries, and notifications built in.
Frequently Asked Questions
What does 0 0 */2 * * mean in cron?
The expression 0 0 */2 * * triggers at 00:00 on every 2nd day-of-month, starting from day 1 — so it fires on days 1, 3, 5, 7, and so on. Because it steps through the day-of-month field (1–31) rather than tracking elapsed time, the last interval of a month may be shorter than 2 days: in a 31-day month the final fire is on day 31, followed immediately by another on day 1 of the next month, giving a gap of just 1 day. If a strict 48-hour cadence is required regardless of month boundaries, consider using a dedicated scheduler like CronJobPro with interval-based scheduling instead.
How do I use this cron expression?
On Linux/macOS, edit your crontab with crontab -e and add:0 0 */2 * * /path/to/your/script.sh
Or use CronJobPro to schedule HTTP requests with this expression — no server required.
What timezone does cron use?
By default, cron uses the system timezone. CronJobPro lets you set a specific timezone per job, so your schedules are predictable regardless of server location.