タイトルごとにこの問題をトラブルシューティングして解決する手順は何ですか?
手動で実行しようとすると、すぐにページが表示され、「実行中のcronを再実行しようとしています」というエラーメッセージが表示されます。
drush sqlq "DELETE FROM semaphore WHERE name = 'cron';"
タイトルごとにこの問題をトラブルシューティングして解決する手順は何ですか?
手動で実行しようとすると、すぐにページが表示され、「実行中のcronを再実行しようとしています」というエラーメッセージが表示されます。
drush sqlq "DELETE FROM semaphore WHERE name = 'cron';"
回答:
cronセマフォはおそらくロックされています。コードのどこからでもdrupal_cron_cleanup()を呼び出すことができます(これはたまたまcronによって呼び出されません)。これにより、cronセマフォ変数のロックが解除されます。
Drupal 6でブラシを設定している場合は、次を試すこともできます。
$ drush vdel -y cron_semaphore
cache_bootstrap
。
drupal_cron_cleanup()
が、更新されていないようです。
次の2つの条件が満たされている場合、表示されているエラーメッセージが発生します。
したがって、このエラーメッセージは、cronタスクが失敗するか、実行に時間がかかりすぎることを示しています。(注:あなたはすでに犯人を発見していることを知っていますが、私がしたように、検索でこのページを見つけた人のために答えを追加したかったです)
最初に理解すべきことは、Drupal cronタスクの実行方法です。Drupal cronは、サーバー上の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実行にのみ適用されます。
cronセマフォ変数は、Drupal 7にはもう存在しません-これは、Drupalの古いバージョン用でした。Drupal 7では、ロックバックエンドが変更される可能性があるため、手動でロックを解除する信頼性の高い方法はありません。ただし、コアロックメカニズムを使用している場合は、データベースを編集してcronロックを解除できます。
DELETE FROM semaphore WHERE name = 'cron';
しかし、これを行うことで症状を修正するだけです。対処が必要な問題は、cronが失敗する/実行に時間がかかる理由です。
cron_semaphore
セマフォロックと呼ばれる別のテーブルに移動させ、変数はDrupalの6内に存在しなかったが、あなたは、Drupalの7を使用していますsemaphore
。
したがって、cronセマフォのロックを解除するソリューションは次のようになります。
Drupal 7
drush sqlq "TRUNCATE semaphore"
Drupal 6
drush -y vdel cron_semaphore
drush sql-query "DELETE FROM semaphore WHERE name='cron'"
Cron Debugモジュールを使用して、cronをデバッグできます。
Cron Debugは、cronプロセスを見つけるのに役立ちます。
- プログラミングまたは実行時エラーが原因で失敗する
- タイムアウト(PHP、サーバー、データベース)
- とても遅い
Cron Debugを使用すると、他のcron機能を実行せずに、特定のcron機能の実行をテストすることもできます。これは、独自の機能をテストするたびに、すべてのメンテナンス、アラート、およびその他のタスクで完全なcron.phpを実行したくないcron機能を開発するのに便利です。
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#n5413
// 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を再実行します。これで実行できるようになります。
これを展開せずに、終了後に元に戻してください。また、デバッグにも役立ちます。
私はこれに何度か思いつきました。Drupal 6では、drushを使用しない場合、次のように修正できます。
1変数テーブルからcron_%変数を削除します。
SELECT * FROM variable WHERE name like "cron%";
DELETE FROM variable WHERE name like "cron%";
2 / admin / settings / performanceのDrupalキャッシュをクリアします
ページの下部にある[キャッシュデータを消去]ボタンを押します。
3管理パネルからcronを実行します/ admin / reports / status / run-cronコマンドラインから実行しないでください。問題が発生する可能性があります。
4次回の自動cron実行が正常に完了することを確認します。
xdebugを使用してデバッグすることができます。管理インターフェイスの[管理]> [構成]> [システム]> [cron]からcronを実行します。