Cron停止运行;日志说:“尝试在已经运行的cron上重新运行。”


11

按照标题,有哪些步骤可以解决和解决此问题?

当我尝试手动运行时,会立即得到一个页面,并显示错误消息“正在运行cron时尝试重新运行它”。


我不记得我想念的是db cron的内容,但是快速搜索“试图在cron已经运行时重新运行cron”的Google指向我指向digitaledgesw.com/node/21,它可能适用于D7
Jimajamma 2011年

真奇怪 在检查完该变量之后(通过drupal_cron_run中的lock_acquire),在内核代码中恰好找到了该消息一次。如果您发布更多信息/症状,指出确实存在差异,我将重新打开它。
mpdonadio

建议:您可以尝试安装新的Drupal并将cron设置为每3分钟运行一次,看看是否有相同的效果!!!
Aboodred1

只需运行:drush sqlq "DELETE FROM semaphore WHERE name = 'cron';"
kenorb

4
致读者:当前接受的答案对于问题所在的Drupal版本7是不正确的。它对Drupal 6有效,但Drupal 7代码已更改;碰巧Drupal 7遗留了Drupal 6中尚未清理的残骸。
kiamlaluno

Answers:


12

cron信号灯可能已锁定。您可以尝试从代码中的任何地方调用drupal_cron_cleanup()(cron不会偶然调用它),并且应该可以解锁cron信号量变量。

如果您在Drupal 6中配置了Drush,也可以尝试:

$ drush vdel -y cron_semaphore

3
如果您具有数据库访问权限而不是drush,则可以从变量表中手动将其删除。
马尔克斯,2011年

8
不要忘记这些值被缓存在表中cache_bootstrap
tostinni '12

1
请问该表的确切名称是什么,因为我在变量表中未找到任何cron_semaphore
Mohammed amine bourkadi 2013年

2
当我运行上面的drush命令时,我得到“找不到cron_semaphore”。有任何想法吗?
奈杰尔·沃特斯2013年

1
@NigelWaters在Drupal 7中,cron信号灯已锁定,但drupal_cron_cleanup()似乎没有更新。
kiamlaluno

19

摘要

如果满足以下两个条件,则会出现您看到的错误消息:

  • 您的Cron作业未完成(错误)或完成了超过4分钟的时间;
  • 您调用cron的频率高于每4分钟一次(根据您的crontab设置,而不是Drupal中的设置)

因此,此错误消息是cron任务的症状,该任务失败或运行时间太长。(注意:我知道您已经找到了罪魁祸首,但是我想像以前一样为通过搜索找到此页面的人添加答案)

背景

首先要了解的是如何运行Drupal cron任务。Drupal cron会定期进行调用 -通过服务器上的cron作业,或者在每次页面加载后调用(如果您使用的是可怜人的cron,这是Drupal的默认设置)。

cron任务不一定在每次调用cron时都运行,但是-Drupal中有一个设置(默认为3小时),该设置说明cron任务应多久运行一次。但是,仅当cron任务成功完成时,才需要3个小时的延迟。

在Drupal 7中,cron使用了Drupal的锁定机制,该机制提供了协作的咨询锁定系统。该锁系统的功能之一是,锁会在一定时间后过期。对于cron,它会在4分钟后过期-因此,如果您的cron每3分钟被调用一次,并且之前的cron作业到那时还没有完成(崩溃或非常慢),您确实会收到此错误消息。

您将cron设置为每12小时这一事实并没有什么不同-因为Drupal cron任务失败/花费的时间太长,Drupal假定它尚未运行,因此尝试在cron调用后立即再次运行它。十二小时的延迟仅适用于成功的cron运行。

cron信号量变量在Drupal 7中不再存在-这是针对较旧版本的Drupal的。在Drupal 7中,没有可靠的方法来手动释放锁定,因为锁定后端可能会更改-但是,如果您使用核心锁定机制,则可以通过编辑数据库来释放cron锁定:

DELETE FROM semaphore WHERE name = 'cron';

但是这样做只能解决问题-需要解决的问题是为什么cron失败/运行时间如此之长。


我收到此消息,但是当我运行cron_debug时,所有cron作业均成功结束并快速运行(核心更新除外,该更新大约需要5秒钟)。如果此问题的根源是cron例程缓慢或失败,那么cron_debug为什么不突出显示它们?
doub1ejack

1
我不知道cron_debug模块的工作方式,所以我不能对此发表评论。变量“ cron_safe_threshold”的值是多少?“信号量”表是什么数据?
爱丽丝·希顿2013年

1
对于正确的解释,这是Drupal 7的正确答案。+ 1。
kiamlaluno

顺便说一句,如果cron对于您来说失败了,请使用Cron Debug模块查看其挂起的模块-搜索模块占10的9倍。尝试关闭搜索模块,然后手动运行cron,看看会发生什么。为了找到它试图索引节点:drupal.stackexchange.com/questions/22825/...
丹Mantyla

4

cron_semaphore变量确实存在于Drupal 6中,但是您正在使用Drupal 7,因此信号灯锁已移至名为的单独表中semaphore

因此,解锁cron信号的解决方案是:

Drupal 7

drush sqlq "TRUNCATE semaphore"

Drupal 6

drush -y vdel cron_semaphore 

3
Drupal 7的“ drush sql-query "DELETE FROM semaphore WHERE name='cron'"
极少

2

您可以使用Cron调试模块调试cron 。

Cron调试将帮助您找到哪个cron进程

  • 由于编程或运行时错误而失败
  • 超时(PHP,服务器,数据库)
  • 都很慢

Cron Debug还可以让您测试运行特定的cron函数,而不运行其他函数。这对于开发cron函数非常有用,因为您不想在每次测试自己的函数时都运行包含所有维护,警报和其他任务的完整cron.php。


1
这个模块对我来说是个救生员!
丹·曼蒂拉

是的,这个模块很好,它有助于调试cron作业。
Nishant

1

这是我解决cron问题的方法:

  1. 通过PhpMyAdmin,我查看了信号量表并删除了其中的行 name = cron
  2. 我通过命令行运行了“ drush cron”
  3. 我看到一条错误消息,为我提供了该问题的线索;对于您来说这可能有所不同,但是对我而言,最近卸载的模块与已安装的模块共享PHP库的模块导致了错误

0

对于Drupal 8:drush sqlq“从信号量中删除,名称='cron';”


0

在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。这将使其运行。

请不要部署它,并在完成后将其还原。它还有助于调试。


-1

我已经遇到了几次。在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 / reports / status / run-cron运行cron不要从comand行运行它,因为这可能会引起问题。

4检查下一次自动cron运行是否正常完成。


欢迎来到Drupal答案!问题是关于Drupal 7的。从该数据库表中删除行不会产生太大影响。
kiamlaluno

嗯,我只是添加了答案,因为它没有具体说明是用于OP中的Drupal 7。这对于drupal 6效果很好,并且比通常的“删除信号量”答案更完整。我认为如果有人从d6结束在这里会很有帮助。那是错的吗?我似乎为此被打下了烙印。
munkiepus 2014年

刚刚更新,从命令行部分删除了运行cron,只是发现它可能会导致问题
munkiepus 2015年

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.