web-dev-qa-db-ja.com

ウォッチドッグなしで「Cron run failed」を解決する

数年前、私はwatchdogをオフにしたかったのですが、それはメモリとデータベースの消費であるためですが、今日はなぜ私cronは、Searchモジュールを使用する必要があるため、実行されていませんか?

cronを手動で実行しようとしていますadmin/reports/status/run-cron)return

cronの実行に失敗しました。

/ cron.phpを呼び出してサーバーのコマンドラインから実行すると、リターンがありません。

これをデバッグするにはどうすればよいですか?

または

ロギングをオンにする他の方法はありますか?

admin/settings/logging/dblog

リターンがありません

SELECT * FROM `watchdog`

MySQLが空の結果セットを返しました

function watchdog()

bootstrap.incにまだあります

settings.phpおよび。htaccess関連する「エラー」、「ウォッチ」、「 dog "、" bdlog "、" repor "キーワード(ないphp.ini

/modules/dblog/dblog.module

まだ手つかず。 XMLサイトマップ およびSearchが無効になっています

いいえlogging、いいえcron、私は困惑しています。助けてくれてありがとう。

1
eapo

watchdog()メッセージの記録を有効にするには、Database loggingモジュール(短い名前:dblog)を有効にするだけです。有効にすると、admin/reports/dblogで最近のログエントリの読み取りを開始します。

Cronを返す可能性のあるエラーについては、次のエラーがあります。

  • Cronが1時間以上実行されており、スタックしている可能性が高い
  • Cronは既に実行されており、再実行しようとしています

これは、Drupalコードから明らかです。admin/ reports/status/run-cronに移動したときに実行される関数は system_cron_run() であり、 drupal_cron_run()TRUEを返さない場合に表示されるエラーを返します。これはその関数コードです。

  // 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;
  }

Drupalはcronがまだ実行中であると考えますが、これはコードのエラー(通常はhook_cron()実装の1つ)がdrupal_cron_run()を許可しない場合に発生します次の行を実行します。

    // Release cron semaphore
    variable_del('cron_semaphore');

つまり、cronが正しく機能しない理由をデバッグするには、hook_cron()の実装を確認して、何が問題なのかを確認する必要があります。また、hook_node_view()を誤って呼び出しているdrupal_goto()の実装が問題である可能性もあります。

2
kiamlaluno

Database loggingを有効にすることはwatchdogを有効にする解決策でした(@kiamlalunoに感謝します)。これはcronを実行した後のメッセージです。

メッセージcronが既に実行されているときにcronを再実行しようとしています。

cron_semaphore原因を手動で削除しています

Cronは正常に実行されました

Searchモジュールが有効な原因

内部サーバーエラー-500

次に、これをsearch.moduleで変更するだけで問題が解決しました。

 function search_cron() {
  // Update Word index
--  foreach (module_list() as $module) {
++  foreach (module_list(true, true, false) as $module) {
1
eapo

Drushをサイトで利用できる場合は、そのDrupalサイトのドキュメントルートから実行できます。

drush cron

さらにトラブルシューティングできるように、エラーが出力されます。また、drushがある場合は、次のようにdblogを有効にすることができます。

drush en -y dblog
1