Configure and run cron
Overview of cron
Several Magento features require at least one cron job, which schedules activities to occur in the future. A partial list of these activities follows:
- Catalog price rules
- Newsletters
- Generating Google sitemaps
- Customer Alerts/Notifications (product price change, product back in stock)
- Reindexing
- Private sales (Magento Commerce only)
- Automatic updating of currency rates
- All Magento e-mails (including order confirmation and transactional)
We recommend you run cron as the Magento file system owner. Do not run cron as root
; we also recommend against running cron as the web server user.
You can no longer run dev/tools/cron.sh
because the script has been removed.
Magento depends on proper cron job configuration for many important system functions, including indexing. Failure to set it up properly means Magento won’t function as expected.
UNIX systems schedule tasks to be performed by particular users using a crontab, which is a file that contains instructions to the cron daemon that tell the daemon in effect to “run this command at this time on this date”. Each user has its own crontab, and commands in any given crontab are executed as the user who owns it.
To run cron in a web browser, see Secure cron.php to run in a browser
Create or remove the Magento crontab
This section discusses how to create or remove your Magento crontab (that is, the configuration for Magento cron jobs).
About the Magento crontab
The Magento crontab is the configuration used to run Magento cron jobs.
Magento uses cron for two sets of tasks, and for each, cron can run with a different configuration:
-
PHP command-line configuration: The general cron job that reindexes indexers, generates e-mails, generates the sitemap, and so on.
-
Web server PHP plug-in configuration: Two other cron jobs are used by the Component Manager and System Upgrade utilities.
- To avoid issues during installation and upgrade, we strongly recommend you apply the same PHP settings to both the PHP command-line configuration and to the PHP web server plug-in’s configuration. For more information, see Required PHP settings.
- In a multi-node system, crontab can run on only one node. This applies to you only if you set up more than one webnode for reasons related to performance or scalability.
Create the Magento crontab
Starting with version 2.2, Magento creates a crontab for you. We add the Magento crontab to any configured crontab for the Magento file system owner. In other words, if you already set up crontabs for other extensions or applications, we add the Magento crontab to it.
The Magento crontab is inside #~ MAGENTO START
and #~ MAGENTO END
comments in your crontab.
To create the Magento crontab:
- Log in as, or switch to, the Magento file system owner.
- Change to your Magento installation directory.
-
Enter the following command:
1
bin/magento cron:install [--force]
Use --force
to rewrite an existing Magento crontab.
magento cron:install
does not rewrite an existing crontab inside#~ MAGENTO START
and#~ MAGENTO END
comments in your crontab.magento cron:install --force
has no effect on any cron jobs outside the Magento comments.
To view the crontab, enter the following command as the Magento file system owner:
1
crontab -l
A sample follows:
1
2
3
4
5
#~ MAGENTO START c5f9e5ed71cceaabc4d4fd9b3e827a2b
* * * * * /usr/bin/php /var/www/html/magento2/bin/magento cron:run 2>&1 | grep -v "Ran jobs by schedule" >> /var/www/html/magento2/var/log/magento.cron.log
* * * * * /usr/bin/php /var/www/html/magento2/update/cron.php >> /var/www/html/magento2/var/log/update.cron.log
* * * * * /usr/bin/php /var/www/html/magento2/bin/magento setup:cron:run >> /var/www/html/magento2/var/log/setup.cron.log
#~ MAGENTO END c5f9e5ed71cceaabc4d4fd9b3e827a2b
The update/cron.php
file exists in Composer- and archive-based Magento installations. It does not exist if you installed Magento by cloning the Magento 2 git repository.
In Composer-based installations, Magento creates the update/
directory when you run composer create-project
. Running composer install
does not create the update/
directory (if it did not exist before). See Recreate the Magento updater.
Starting in Magento version 2.3.4, cron tasks are categorized into two groups:
- The
all
group includes thecron:run
,update/cron.php
, andsetup:cron:run
tasks. - The
non-optional
group includes only thecron:run
task.
Use --non-optional
(or -d
) to install a non-optional CRON job:
1
bin/magento cron:install --non-optional
1
2
3
#~ MAGENTO START
* * * * * /usr/bin/php /var/www/html/magento2/bin/magento cron:run | grep -v Ran jobs by schedule >> /var/www/html/magento2/var/log/magento.cron.log
#~ MAGENTO END
Remove the Magento crontab
You should remove the Magento crontab only before uninstalling the Magento application.
To remove the Magento crontab:
- Log in as or switch to the Magento file system owner.
- Change to the Magento installation directory.
-
Enter the following command:
1
bin/magento cron:remove
This command has no effect on cron jobs outside the #~ MAGENTO START
and #~ MAGENTO END
comments in your crontab.
Run cron from the command line
Command options:
1
bin/magento cron:run [--group="<cron group name>"]
where --group
specifies the cron group to run (omit this option to run cron for all groups)
To run the indexing cron job, enter:
bin/magento cron:run --group index
To run the default cron job, enter:
bin/magento cron:run --group default
To set up custom cron jobs and groups, see Configure custom cron jobs and cron groups.
You must run cron twice: the first time to discover tasks to run and the second time — to run the tasks themselves. The second cron run must occur on or after the scheduled_at
time for every task.
Logging
All cron
job information has moved from system.log
into a separate cron.log
.
By default, the cron information can be found at <install_directory>/var/log/cron.log
.
All exceptions from cron jobs are logged by \Magento\Cron\Observer\ProcessCronQueueObserver::execute
.
In addition to being logged in cron.log
:
-
Failed jobs with
ERROR
andMISSED
statuses are logged to the<install_directory>/var/log/support_report.log
. -
Jobs with an
ERROR
status are always logged asCRITICAL
in<install_directory>/var/log/exception.log
. -
Jobs with a
MISSED
status are logged asINFO
in the<install_directory>/var/log/debug.log
directory (developer mode only).
All cron data is also written to the cron_schedule
table in the Magento database. The table provides a history of cron jobs, including:
- Job ID and code
- Status
- Created date
- Scheduled date
- Executed date
- Finished date
To see records in the table, log in to the Magento database on the command line and enter SELECT * from cron_schedule;
.