Skip to main content
Cron Jobs is the cPanel UI for the standard Linux cron daemon. Pick a schedule, paste a command, save. The job runs in your shell environment with your account’s permissions.
Cron Jobs page with email field and add-cron form

Anatomy of the page

SectionWhat it does
Cron Email (top)Email address that receives any output the job produces. Set this once.
Add New Cron JobThe form for building a new schedule and command.
Current Cron Jobs (bottom)List of jobs already scheduled. Edit or delete from here.

Add a cron job

1

Pick a preset from Common Settings

The dropdown sets all five timing fields at once. Useful presets:
PresetSchedule
Once a minute* * * * *
Every 5 minutes*/5 * * * *
Every 15 minutes*/15 * * * *
Once an hour0 * * * *
Once a day (midnight)0 0 * * *
Once a week (Sunday midnight)0 0 * * 0
2

Or fill the timing fields by hand

Five fields: Minute, Hour, Day, Month, Weekday. Each accepts:
  • A number: 15 (the 15th minute, hour, day, etc.)
  • A range: 1-5
  • A list: 0,15,30,45
  • A step: */10 (every 10 minutes)
  • * for “any value”
Example: 0 2 * * * is “minute 0 of hour 2, every day”, which means daily at 2:00 AM server time.
3

Paste the command

Anything that runs in your shell. The command runs as your cPanel user, with your account’s PATH.A few examples:
/usr/local/bin/php /home/USER/public_html/cron.php
/home/USER/scripts/backup.sh
cd /home/USER/laravel && /usr/local/bin/php artisan schedule:run >> /dev/null 2>&1
Replace USER with your cPanel username.
4

Click Add New Cron Job

The job appears in the Current Cron Jobs table. It runs at the next matching time slot.

Common cron uses

WordPress: replace wp-cron.php with system cron

WordPress’s built-in wp-cron.php runs on every page request, which is wasteful on busy sites. The fix is two-step:
1

Disable wp-cron.php in wp-config.php

Add this line above the /* That's all, stop editing! */ line:
define( 'DISABLE_WP_CRON', true );
2

Add a system cron to run wp-cron every 5 minutes

Schedule: */5 * * * * (every 5 minutes).Command:
/usr/local/bin/php /home/USER/public_html/wp-cron.php >/dev/null 2>&1
Use the path to the actual wp-cron.php for your install.

Laravel scheduler

Laravel ships with a single cron entry that handles all the app’s scheduled tasks. Schedule: * * * * * (every minute). Command:
cd /home/USER/laravel && /usr/local/bin/php artisan schedule:run >> /dev/null 2>&1
Laravel’s own schedule() definitions in app/Console/Kernel.php decide which tasks actually run.

Daily backup script

Schedule: 0 3 * * * (3 AM daily). Command:
/home/USER/scripts/backup.sh >> /home/USER/scripts/backup.log 2>&1
The output goes to a log file instead of email; useful for keeping a history.

Pitfalls

Most common cause: the command’s PATH doesn’t match your shell PATH. Cron uses a minimal PATH by default, so php (without a full path) often isn’t found. Always use the full path to the binary: /usr/local/bin/php for cPanel-managed PHP, or /opt/cpanel/ea-php83/root/usr/bin/php for a specific PHP version.Other things to check: file permissions on the script (chmod +x backup.sh), the script’s shebang line, and that the working directory is right (cd into it first if your script reads relative paths).
Two options. First, redirect output to /dev/null in the command itself:
/usr/local/bin/php /home/USER/cron.php >/dev/null 2>&1
>/dev/null drops stdout, 2>&1 drops stderr too. Most production crons do this.Second, clear the Cron Email field at the top of the page to disable email entirely for all jobs. Less surgical, but if you don’t care about any cron output, simpler.
Cron jobs use the system default PHP (/usr/bin/php), not your cPanel-selected version. To use the version you set in Select PHP Version, use /usr/local/bin/php (the cPanel wrapper). To pin a specific version, use the absolute path: /opt/cpanel/ea-php83/root/usr/bin/php (replace 83 with 82, 81, etc.).
Browser and cron run with different environment variables, working directories, and (often) PHP versions. Cron has no $_SERVER, no $_REQUEST, and getcwd() returns your home directory unless you cd first. If your script depends on web-only globals or relative paths, fix the script to handle CLI mode.
Long-running cron jobs can overlap if a single run takes longer than the schedule interval. Wrap with flock to prevent overlap:
/usr/bin/flock -n /tmp/myjob.lock /usr/local/bin/php /home/USER/cron.php
-n means “skip this run if the lock is held”. The lock auto-releases when the previous run finishes.
One minute. The cron syntax doesn’t support sub-minute intervals. For higher-frequency tasks, write a long-running script that loops with sleep and run that from cron once a minute, or look at supervisord for proper process management.

Need a hand?