Cron expression translator
crontab line, plain English.
Paste the five fields exactly as they stand in the crontab. The translator reads them back as one English sentence, decodes every field, and lists the next ten runs so you can check the schedule as dates — all in your browser.
Any cron line, in three moves.
Crontab lines are written once and inherited forever. This is the reading order that makes an unfamiliar one fall apart:
1 · Count the fields
Five space-separated fields is crontab. Six or seven means Quartz or another seconds-first scheduler — a different language that happens to look alike. Everything after the fifth field is the command, not the schedule.
5 = cron · 6+ = not cron2 · Read the last two first
Day-of-month and day-of-week decide which days. If both carry numbers, stop right there: cron fires when either matches — the OR rule, and the classic misreading.
both set → OR, not AND3 · Then the first two
Minute and hour are what time on those days. A star in the minute slot means 60 runs an hour. The month field only matters when it isn’t a star.
* in minute = 60×/hourA crontab you’ve never seen.
The output of crontab -l on a box you just inherited, decoded line by line. Translate any of them — the button loads it into the reader above.
*/5 * * * * /usr/local/bin/health-ping.sh
30 3 * * * /usr/local/bin/backup.sh >> /var/log/backup.log 2>&1
0 9 * * 1-5 /usr/local/bin/daily-digest.sh
0 6 1 * * /usr/local/bin/invoice-run.sh
Decode the punctuation, not just the numbers
Each symbol is a compression, and unpacking them wrong is how a schedule gets misread in review:
- Steps count from the field’s minimum. */6 in the hour field is 00, 06, 12, 18 — not “six hours after whenever it last ran”.
- Numbers in both day fields mean OR, not AND. Cron fires when either one matches, so the schedule is wider than it looks.
- Names and nicknames are dialect. MON and @daily read fine here and in most crons — numbers are the spelling every cron accepts.
The symbols, read back
what each one unpacks toOne schedule, four spellings.
All four lines below are Sunday at midnight. The translator reads each back to the same sentence — and the same next-run list, which is the proof that matters.
The schedules you’ll meet most.
Each one is decoded already, and links to its full page — next runs, variants, and the crontab line ready to copy. The whole set lives in the cron examples library.
Cron expressions people paste most
Every minute of every hour, every day — 1,440 runs a day, 525,600 a year. All five fields are wildcards, so nothing is restricted. It’s the right schedule for a cheap health ping and the wrong one for almost anything else. Inherited in front of an expensive script, it’s the first line to question.
Every 5th value of that field, counted from its minimum. In the minute field, */5 fires at :00, :05, :10 … :55 — 12 times an hour, on the clock marks. It does not mean “5 minutes after the last run”: cron matches clock values. So */7 gives you :00, :07 … :56 and then :00 again — a 4-minute gap at the top of every hour.
Every day at midnight, server time — minute 0 of hour 0, any date, any month, any weekday. It’s the exact schedule @daily abbreviates. “Midnight” is the server’s midnight, and on DST changeover nights a local-time server can skip or repeat it.
Identical. The nicknames map exactly: @hourly = 0 * * * *, @daily and @midnight = 0 0 * * *, @weekly = 0 0 * * 0, @monthly = 0 0 1 * *, @yearly = 0 0 1 1 *. The odd one out is @reboot — it isn’t a schedule at all, it fires when the cron daemon starts. This translator expands the nicknames so you always see the five fields underneath.
Because it isn’t from a crontab. Quartz (Jenkins, Spring), some cloud schedulers and a few cron libraries put a seconds field first, making six — or seven with a trailing year. A crontab won’t install it. If the seconds field is 0, drop it and the remaining five usually read as POSIX. If it’s anything else, the schedule fires sub-minute, and plain cron cannot say that at all.
It’s Quartz for “no specific value”. Quartz requires exactly one of the two day fields to stand down, so one of them gets a question mark. POSIX cron has no such rule and no ? — a plain * does the job. When both day fields are restricted, cron runs on the union of the two. Paste a ? into a crontab and the line is rejected.
Paste the expression above. The result view lists the next ten runs as concrete dates, computed by a real parser in your browser’s timezone. The crontab itself executes on the server’s clock: if the box runs UTC and you don’t, the whole list shifts by your offset. Nothing tells you a run succeeded, though — cron only ever logs that it started.
Keep exploring
Free tools are just the start.
Uptimia keeps your sites healthy.
Uptime, SSL, domain expiry, page speed, transactions — monitored from 171+ locations worldwide. Free for 30 days.