DELETE FROM `variable` WHERE name = "cron_semaphore"
来自 https://blog.csdn.net/iteye_2723/article/details/81926452
Cron停止运行;日志上说:“试图在cron已经运行时重新运行cron。”
按照标题来排除和解决这个问题的步骤是什么?
当我尝试手动运行时,我会立即得到一个页面,并收到错误消息“试图在cron已经运行时重新运行它”。
回答 9
发布于 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作业不完成(错误)或超过4分钟完成;
调用cron比每4分钟更频繁(根据crontab设置,而不是Drupal中的设置)
因此,此错误消息是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信号量的解决方案是:
Drupal 7
drush sqlq "TRUNCATE semaphore"
Drupal 6
drush -y vdel cron_semaphore
发布于 2015-05-26 05:29:09
您可以使用Cron Debug模块调试cron。
Cron Debug将帮助您找到cron进程
由于编程或运行时错误而失败
超时(PHP、服务器、数据库)
都很慢
Cron Debug还允许您测试运行特定的cron函数,而不运行其他函数。这对于开发cron函数是很好的,您不希望每次测试自己的函数时都运行包含所有维护、警报和其他任务的完整cron.php。
发布于 2015-03-24 13:21:16
我就是这样解决cron问题的:
通过PhpMyAdmin,我查看了信号量表,并删除了
name = cron
所在的行我通过命令行运行了"drush cron“
我看到了一条错误消息,为我提供了这个问题的线索;这对您来说可能不一样,但对于我来说,最近卸载的模块与已安装的模块共享PHP库会导致错误
发布于 2017-04-13 14:51:31
对于Drupal 8: drush sqlq“从信号量删除其中的名称=‘cron’;
发布于 2018-12-11 01:23:09
在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。这样它就可以运行了。
请不要部署它,并在它完成后恢复它。它也有助于调试。
发布于 2014-07-31 16:01:05
我遇到过几次这样的事。在Drupal 6中,如果不使用drush,您可以这样修复它:
1从变量表中删除cron_%变量。
SELECT * FROM variable WHERE name like "cron%";
DELETE FROM variable WHERE name like "cron%";
2清除Drupal缓存:/admin/设置/性能
按下页面底部的“清除缓存数据”按钮。
3从管理面板/ admin /reports/status/ run运行cron,不要从comand行运行它,因为这会导致问题。
4检查下一个自动cron运行是否正常完成。
发布于 2015-05-26 09:18:14
您可以使用xdebug进行调试,从管理界面运行cron管理>配置> system > cron。
来自 https://cloud.tencent.com/developer/ask/sof/116541734