web-dev-qa-db-ja.com

cronは実行を停止しました。ログには、「cronが既に実行されているときにcronを再実行しようとしています」と書かれています。

タイトルごとにこの問題をトラブルシューティングして解決する手順は何ですか?

手動で実行しようとすると、すぐにページが表示され、「実行中のcronを再実行しようとしています」というエラーメッセージが表示されます。

11
giorgio79

Cronセマフォはおそらくロックされています。コード内のどこからでも drupal_cron_cleanup() を呼び出してみて(たまたまcronによって呼び出されることはありません)、cronセマフォ変数のロックを解除する必要があります。

Drupal 6でdrushを構成している場合は、次の方法も試してください。

$ drush vdel -y cron_semaphore
12
amateur barista

概要

表示されているエラーメッセージは、次の2つの条件が満たされた場合に発生します。

  • Cronジョブが完了しない(エラー)か、完了するまでに4分以上かかります。
  • 4分ごとよりも頻繁にcronを呼び出す(Drupalの設定ではなく、crontab設定による)

したがって、このエラーメッセージは、失敗しているか、実行に時間がかかりすぎているcronタスクの症状です。 (注:すでに犯人を見つけたと思いますが、私が行ったように、検索でこのページを見つけた人に回答を追加したいと思いました)

バックグラウンド

最初に理解することは、Drupal cronタスクがどのように実行されるかです。Drupal cronはinvoked一定の間隔で-サーバーのcronジョブを使用するか、Drupalのデフォルトである貧乏人のcronを使用する場合は、ページをロードするたびに。

Cronタスクは、cronが呼び出されるたびに実行されるとは限りません。ただし、Drupal(デフォルトは3時間)に設定されており、cronタスクを実行する頻度を示しています。ただし、この3の遅延時間は、cronタスクが正常に終了した場合にのみ適用されます。

Drupal 7の場合、cronはDrupalの ロックメカニズム を使用します。これは、協調的な助言ロックシステムを提供します。このロックシステムの機能の1つは、一定の時間が経過するとロックが期限切れになることです時間です。cronの場合、4分後に期限切れになります。つまり、cronが3分ごとに呼び出され、以前のcronジョブがその時間までに完了しなかった場合(クラッシュしたか、非常に低速でした)、実際にこれを取得します。エラーメッセージ。

Cronを12時間ごとに設定しても、違いはありません-Drupal cronタスクが失敗する/時間がかかりすぎるため、Drupalがそれを想定しているため実行されていないため、cronが呼び出されたらすぐに再実行を試みます。12時間の遅延は、成功したcronの実行にのみ適用されます。

Drupal 7-これは古いバージョンのDrupal用でした。cronセマフォ変数はもう存在しません。Drupal 7では、手動で信頼できる方法はありませんロックバックエンドが変更される可能性があるため、ロックを解放します。ただし、コアロックメカニズムを使用している場合は、データベースを編集してcronロックを解放できます。

DELETE FROM semaphore WHERE name = 'cron';

しかし、これを行うことで症状を修正するだけです-対処する必要がある問題は、cronが失敗する/実行に非常に長い時間がかかる理由です。

19
Alice Heaton

cron_semaphore変数はDrupal 6に存在しましたが、Drupal 7を使用しているため、セマフォロックはsemaphoreと呼ばれる別のテーブルに移動しました。

したがって、cronセマフォのロックを解除するソリューションは次のようになります。

Drupal 7

drush sqlq "TRUNCATE semaphore"

Drupal 6

drush -y vdel cron_semaphore 
4
kenorb

Cron Debug モジュールを使用してcronをデバッグできます。

Cronデバッグは、cronプロセスを見つけるのに役立ちます

  • プログラミングまたはランタイムエラーが原因で失敗する
  • タイムアウト(PHP、サーバー、データベース)
  • とても遅い

Cron Debugを使用すると、特定のcron機能をテスト実行しながら、他の機能を実行しないこともできます。これは、独自の関数をテストするたびに、すべてのメンテナンス、アラート、その他のタスクを含む完全なcron.phpを実行したくないcron関数を開発するのに最適です。

2
Nishant

これが私がcronの問題を解決した方法です:

  1. PhpMyAdminを介して、セマフォテーブルを調べ、name = cron
  2. コマンドラインから「drush cron」を実行しました
  3. 問題の手がかりとなるエラーメッセージが表示されました。これはあなたにとっては異なるかもしれませんが、私にとっては、PHPライブラリがインストールされたモジュールを共有している最近アンインストールされたモジュールがエラーの原因でした
1
albertski

Drupal 8の場合:drush sqlq "DELETE FROM semaphore WHERE name = 'cron';"

0
Diana

Drupal 7では、別のオプションとして、

drush cron経由で

WD cron: Attempting to re-run cron while it is already running.       [warning]
Cron run failed.                                                      [error]

これは開発環境で発生し、以前のcronが実行されていて中断されたために発生しました。

includes/common.incの5413行目付近に、このブロックがあります https://cgit.drupalcode.org/drupal/tree/includes/common.inc?h=7.x #n541

  // Try to acquire cron lock.
  if (!lock_acquire('cron', 240.0)) {
    // Cron is still running normally.
    watchdog('cron', 'Attempting to re-run cron while it is already running.', array(), WATCHDOG_WARNING);
  }

if&& FALSEで変更します。

  // Try to acquire cron lock.
  if (!lock_acquire('cron', 240.0) && FALSE) {
    // Cron is still running normally.
    watchdog('cron', 'Attempting to re-run cron while it is already running.', array(), WATCHDOG_WARNING);
  }

そしてcronを再実行します。これで実行できます。

これをデプロイせず、終了後に元に戻してください。また、デバッグにも役立ちます。

0
rovr138

私はこれに数回反対しています。 Drupal 6では、drushを使用しない場合は、次のように修正できます。

1変数テーブルからcron_%変数を削除します。

SELECT * FROM variable WHERE name like "cron%";

DELETE FROM variable WHERE name like "cron%";

2クリアDrupalキャッシュ:/ admin/settings/performance

ページの下部にある[キャッシュデータのクリア]ボタンを押します。

3 adminパネルからcronを実行します/ admin/reports/status/run-cronコマンドラインから実行しないでください。問題が発生する可能性があります。

4次の自動cron実行が正常に完了することを確認します。

0
munkiepus