Paste the schedule from a crontab line or a cPanel/DirectAdmin cron job and see exactly when it will run. Everything is calculated in your browser using your local time zone.
Table of Contents
Cron syntax in brief
Fields are minute (0–59), hour (0–23), day of month (1–31), month (1–12 or jan–dec) and day of week (0–7 or sun–sat, where 0 and 7 are Sunday). */15 means every 15 units, 1-5 is a range, and lists are comma-separated.
When both day of month and day of week are restricted, standard cron runs when either matches — a common surprise.
Cron expression at a glance



How to use this tool
- Paste only the five schedule fields, for example
*/15 2-5 * * 1-5. If you paste a whole crontab line with the command, the field count is wrong and you get the “Enter five fields” error. - Lines from
/etc/crontabor/etc/cron.d/also have a user name after the schedule. Leave it out together with the command. - Instead of five fields you can enter
@hourly,@daily,@midnight,@weekly,@monthly,@yearlyor@annuallyin lowercase.@reboothas no time schedule and is not accepted. - Month and weekday names work by their first three letters (
jan,mon), in any case, also in ranges such asmon-friand lists such asjan,apr,jul,oct. - Press Explain. Everything runs in your browser.
The helper reads standard Linux crontab syntax as used by cronie, Vixie cron, cPanel and DirectAdmin. Extensions from other schedulers are rejected as invalid: a seconds or year field, ?, L, W and # (Quartz, AWS EventBridge), H (Jenkins) and cronie’s ~ random ranges.
How to read the results
| Row | What it shows |
|---|---|
| Minute, Hour, Day of month, Month, Day of week | “every minute”, “every hour” and so on when the field is *. Otherwise the full list of values the field expands to, so */15 in the minute field shows minute 0, 15, 30, 45. Month and weekday values are shown as names. |
| Next runs (your local time) | The next eight times the schedule fires, starting from the next minute, in the time zone of your browser, for example Wed Oct 07 2026 14:05. |
| Note about day of month and day of week | Appears when both day fields are restricted. The job then runs when either one matches, not only when both do. |
The run list searches roughly the next 14 months. A schedule that never matches in that window, such as 0 0 31 2 * (31 February), returns an empty table, which is a quick way to spot an impossible date.
Common problems and how to fix them
“bad minute” and “errors in crontab file, can’t install.”
crontab -e checks the file when you save it. Debian and Ubuntu print the file, line number and failing field, such as "cron-jobs.txt":4: bad minute, followed by “errors in crontab file, can’t install.” Cronie on AlmaLinux and Rocky prints “Invalid crontab file, can’t install.” and offers “Do you want to retry the same edit? (Y/N)”. The field name (bad hour, bad day-of-month, bad month, bad day-of-week, bad command) tells you what to fix: a value out of range, a missing field or a stray character. Paste the schedule here to see which field fails.
The script works in SSH but not from cron
Cron does not load your login shell’s profile, so PATH, the PHP version and the working directory can all differ from your SSH session. Use full paths for the interpreter and the script, and change into the script’s directory if it loads files relative to itself. On cPanel, /usr/local/bin/php picks the PHP version that the script’s directory is set to in MultiPHP Manager, falling back to the server default; to force one version, call its versioned binary such as /usr/bin/ea-php83.
*/10 * * * * cd /home/user/app && /usr/local/bin/php artisan schedule:run >> /home/user/cron.log 2>&1
The command is cut off at a % sign
In a crontab, an unescaped % in the command ends the command and the rest is sent to it as standard input. Escape every percent sign with a backslash:
15 2 * * * /usr/bin/mysqldump mydb > /backup/mydb-$(date +\%F).sql
*/35 or */45 does not run every 35 or 45 minutes
A step only counts within its own field and starts again every hour. */35 means minutes 0 and 35, so the gap alternates between 35 and 25 minutes. The minute row here shows exactly which minutes match. For a true 35-minute interval, use a systemd timer or a test inside the job.
Cron emails fill the mailbox, or no output arrives at all
Cron mails any output to the crontab owner or to MAILTO. Set MAILTO="" at the top of the crontab, or end the command with >/dev/null 2>&1; in cPanel you can also clear the Cron Email field. Throwing output away makes failures invisible, so while testing append to a log with >> /home/user/cron.log 2>&1 instead.
Runs overlap when a job takes longer than its interval
Cron starts the next run even if the previous one is still working, which can double-run backups or imports. Wrap the job in flock so a second copy exits at once:
*/5 * * * * /usr/bin/flock -n /tmp/import.lock /home/user/bin/import.sh
The job runs at the wrong hour after a time zone change
Cron uses the server’s time zone, which you can check and set with timedatectl. After changing it, restart the cron daemon (systemctl restart crond on AlmaLinux, systemctl restart cron on Ubuntu) so it is sure to use the new zone. Remember that the next-run list here is in your browser’s zone; the time zone converter helps compare them.
Common schedules
| Schedule | Expression |
|---|---|
| Every hour at half past | 30 * * * * |
| Every day at 02:15 | 15 2 * * * |
| Every 6 hours (00:00, 06:00, 12:00, 18:00) | 0 */6 * * * |
| Weekdays at 08:00 | 0 8 * * 1-5 or 0 8 * * mon-fri |
| Every Sunday at 03:00 | 0 3 * * 0 |
| First day of every month at midnight | 0 0 1 * * |
| Quarterly, first day at 04:00 | 0 4 1 jan,apr,jul,oct * |
Cron has no field for “last day of the month”. Run the job on days 28 to 31 and let it continue only when tomorrow is the 1st (GNU date; note the escaped percent sign):
0 23 28-31 * * [ "$(date -d tomorrow +\%d)" = "01" ] && /home/user/bin/month-end.sh
For WordPress, replacing the visitor-triggered WP-Cron with a real cron job makes scheduled posts and backups run on time. Add define( 'DISABLE_WP_CRON', true ); to wp-config.php and run wp cron event run --due-now with WP-CLI every five minutes. To build a schedule from a plain-English description, try the AI cron builder.
Official documentation: cPanel & WHM documentation, AlmaLinux wiki, Linux man pages.
Related guides: Ubuntu 24.04 or AlmaLinux 9/10 for a new cPanel server in 2026? · How to install cPanel & WHM on AlmaLinux 10 (2026 checklist) · What changed in cPanel 138: Meridian, Ask AI, Nova, MCP and domain rename.
Frequently asked questions
How do I run a job every 5 minutes?
*/5 * * * *
Which time zone does cron use?
The server’s system time zone (check with timedatectl) unless the crontab sets CRON_TZ. This helper shows runs in your browser’s time zone.
Why didn’t my cron job run?
Check the cron log (/var/log/cron or journalctl -u crond), use full paths to commands, and remember cron’s PATH is minimal. Redirect output to a log file while testing.
Can I paste a whole crontab line?
Paste only the five time fields or an @ macro. The command, and the user name used in /etc/crontab, must be removed first.
Does the helper support @reboot?
No. @reboot runs once when the cron daemon starts and has no time schedule, so there are no next runs to show.
Does it understand Quartz or AWS cron expressions?
No. Those formats add seconds or a year field and characters such as ?, L, W and #, which Linux cron does not support. Only standard five-field expressions are accepted.
How do I run a job every 30 seconds?
Cron cannot schedule below one minute. Add two lines, one with the command and one with sleep 30 before it, or use a systemd timer.
Why does */35 run at minute 0 and 35?
Steps restart at the beginning of every hour, so */35 matches minutes 0 and 35 only. Cron has no way to express an interval that does not divide evenly into the hour.
How do I stop cron from sending email?
Put MAILTO=”” at the top of the crontab, or redirect the job output with >/dev/null 2>&1. In cPanel you can also clear the Cron Email address.