按照标题来排除和解决这个问题的步骤是什么?
当我尝试手动运行时,我会立即得到一个页面,并收到错误消息“试图在cron已经运行时重新运行它”。
发布于 2011-12-13 00:19:54
cron信号量可能被锁定了。您可以尝试从代码中的任何位置调用德鲁帕尔_cron_清理() (这并不是cron所调用的),并且应该会解锁cron信号量变量。
如果在Drupal 6中配置了drush,也可以尝试:
$ drush vdel -y cron_semaphore
发布于 2013-07-25 10:47:31
如果满足以下两个条件,将出现您正在看到的错误消息:
因此,此错误消息是cron任务失败或运行时间过长的症状。(注:我知道你已经找到了罪魁祸首,但我想为那些通过搜索找到这个页面的人添加一个答案,就像我一样)
首先要了解的是Drupal任务是如何运行的。Drupal是定期调用的--或者通过服务器上的cron作业调用,或者在每次加载页面之后调用,如果您使用了穷人的cron (这是Drupal的默认值)。
然而,不一定每次调用cron时都运行cron任务--在Drupal中有一个设置(默认为3小时),这说明cron任务应该多久运行一次。但是,只有当cron任务成功完成时,3小时的延迟才适用。
在Drupal 7中,cron使用了Drupal的锁定机构,它提供了一个协作的、顾问式的锁系统。这个锁系统的一个特点是锁在一定时间后过期。在cron的情况下,它在4分钟后到期--因此,如果您的cron每3分钟被调用一次,而之前的cron作业到那时还没有完成(要么崩溃了,要么非常慢),那么您确实会得到这个错误消息。
将cron设置为每12小时一次的事实并没有什么区别--因为Drupal任务失败/花费太长时间,Drupal假设它没有运行,所以在调用cron时尝试再次运行它。12小时的延迟只适用于成功的cron运行。
cron信号量变量在Drupal 7中不再存在--这是针对较早版本的Drupal的。在Drupal 7中,不存在手动释放锁的可靠方法,因为锁定后端可能会发生变化--但是,如果使用核心锁定机制,则可以通过编辑数据库来释放cron锁:
DELETE FROM semaphore WHERE name = 'cron';
但是这样做只会修复症状--需要解决的问题是为什么cron失败/花了这么长时间才能运行。
发布于 2014-07-31 15:54:44
cron_semaphore
变量确实存在于Drupal 6中,但是您使用的是Drupal 7,因此信号量锁移到了名为semaphore
的单独表中。
因此,解锁cron信号量的解决方案是:
drush sqlq "TRUNCATE semaphore"
drush -y vdel cron_semaphore
https://drupal.stackexchange.com/questions/17264
复制相似问题