First I need to understand how Magento cron works.
I know how cron works on linux, using crontab -e
.
I know I need to set up Magento\'s cron.php to run
To test cron working or not you can simply write Mage::log('cron working', null, 'cron.log');
at the end of the cron.php file.
If the cron is working, it will create a cron.log file in your base dir.
If you're on GNU/Linux you can check /var/log/syslog
and filter out the cronjobs by using grep
. To see a list of all cronjobs that were run, type in grep 'cron' /var/log/syslog
.
Magento's cron entry point is the cron.php
script in your Magento root. You'll need to setup an OS crontab entry hit this script, which you appear to have done already.
How the cron works
Every time the cron.php
script is hit three things happen:
config.xml
files for <config><crontab>...</crontab></config>
jobs
entries, reading their cron_expr
elements for detail on how often they should be run. Magento then populates the cron schedule table with jobs that should be executed in the future, along with timestamps for when they should be run. The extent into the future that Magento does this is configurable in the admin.Duplicate runs?
You raise an interesting point. What happens if you have a 10 minute cron scheduled in Magento, but cron.php
is only guaranteed to be hit every 15 minutes. It appears that Magento would run your Magento jobs twice, in some cases:
I've only read the code, and that's what appears to happen. The best way to find out would be, of course, to run it and find out. If you want to avoid the issue, in most cases, then increase the cron.php
execution frequency to every 5 minutes, which is what we do.
Testing your code
If you want to test if your cron is actually working without waiting an age, set the cron_expr
to execute every minute, or clear out your cron schedule table then hit cron.php
twice (once to generate the schedule, and again to run the job).
If you want to just test that your model is working, you could setup a test script (outlined in https://www.nicksays.co.uk/testing-magento-modules), and run that.
Your question prompted a blog post: https://www.nicksays.co.uk/dissecting-the-magento-cron-system :)
adding these to the bottom of cron.php will make it write out cron.php.log on execution with the datetime
try {
Mage::getConfig()->init()->loadEventObservers('crontab');
Mage::app()->addEventArea('crontab');
Mage::dispatchEvent('default');
$log = fopen(__FILE__.'.log', 'a');
fwrite($log, date("Y-m-d H:i:s").PHP_EOL);
fclose($log);
} catch (Exception $e) {
Mage::printException($e);
}
On the second half of your question... how to tell if its running.
Here is something that I did. I added the following code at the end of the cron.php file. This updates a simple log called "cronlog.txt" everytime the cron.php file gets called.
So, if I have doubts about cron running I can just glance at that file and see the last date and time the cron.php file ran.
try {
$myFile = "cronlog.txt";
$fh = fopen($myFile, 'w');
$stringData = date('l jS \of F Y h:i:s A');
fwrite($fh, $stringData);
fclose($fh);
} catch (Exception $e) {
Mage::printException($e);
}