سؤال

Some years ago i wanted to turn off watchdog because it's memory and db consumption, but today i need info about why my cron isn't running because need to use Search module from now?

Trying to run cron manually (admin/reports/status/run-cron) return

Cron run failed.

calling /cron.php and running from server's command line has no return,

How can i debug this?

or

There is any other way to turn on logging?

admin/settings/logging/dblog

has no return

SELECT * FROM `watchdog`

MySQL returned an empty result set

function watchdog()

still there in bootstrap.inc

settings.php and .htaccess free from any relevant "error", "watch", "dog", "bdlog", "repor" keywords (have no php.ini)

/modules/dblog/dblog.module

still untouched. XML sitemap and Search is disabled

No logging, no cron, i am puzzled. Thanks for any help.

هل كانت مفيدة؟

المحلول

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 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().

نصائح أخرى

If you have Drush available on the site, you can run this from the document root for that Drupal site:

drush cron

It should output errors so you can further troubleshoot. Also, if you have drush, you can enable dblog like so:

drush en -y dblog

Enabling the Database logging was the solution to enable watchdog (thank you @kiamlaluno), then this is the message after running cron:

Message Attempting to re-run cron while it is already running.

Manually deleting cron_semaphore cause

Cron ran successfully

but with Search module enabled cause

Internal Server Error - 500

Then just changing this in search.module resolved the problem:

 function search_cron() {
  // Update word index
--  foreach (module_list() as $module) {
++  foreach (module_list(true, true, false) as $module) {
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى drupal.stackexchange
scroll top