To enable the recording of the watchdog()
messages, you just need to enable the Database logging module (short name: dblog). Once you enable it, on admin/reports/dblog you will start reading the recent log entries.
As for the possible error that could return cron, they are the following ones:
- Cron has been running for more than an hour and is most likely stuck
- Cron is already running and you try to re-run it
This is evident from Drupal code. The function that is executed when you go to admin/reports/status/run-cron is system_cron_run()
, which returns the error you are seeing when drupal_cron_run()
doesn't return TRUE
. This is that function code.
// Try to allocate enough time to run all the hook_cron implementations.
if (function_exists('set_time_limit')) {
@set_time_limit(240);
}
// Fetch the cron semaphore
$semaphore = variable_get('cron_semaphore', FALSE);
if ($semaphore) {
if (time() - $semaphore > 3600) {
// Either cron has been running for more than an hour or the semaphore
// was not reset due to a database error.
watchdog('cron', 'Cron has been running for more than an hour and is most likely stuck.', array(), WATCHDOG_ERROR);
// Release cron semaphore
variable_del('cron_semaphore');
}
else {
// Cron is still running normally.
watchdog('cron', 'Attempting to re-run cron while it is already running.', array(), WATCHDOG_WARNING);
}
}
else {
// Register shutdown callback
register_shutdown_function('drupal_cron_cleanup');
// Lock cron semaphore
variable_set('cron_semaphore', time());
// Iterate through the modules calling their cron handlers (if any):
module_invoke_all('cron');
// Record cron time
variable_set('cron_last', time());
watchdog('cron', 'Cron run completed.', array(), WATCHDOG_NOTICE);
// Release cron semaphore
variable_del('cron_semaphore');
// Return TRUE so other functions can check if it did run successfully
return TRUE;
}
As for why Drupal thinks the cron is still running, that happens when an error in the code (generally one of the hook_cron()
implementations) doesn't permit drupal_cron_run()
to execute the following line:
// Release cron semaphore
variable_del('cron_semaphore');
This means that to debug why cron doesn't work properly, you need to check any hook_cron()
implementation, and see what is wrong with them. The problem could also be an implementation of hook_node_view()
which is wrongly calling drupal_goto()
.