释放Cron锁定


15

我跑了cron并中止了执行。现在我收到此消息:

尝试在cron已经运行时重新运行它。

在Drupal 7中,我可以删除 cron_semaphore变量。

在Drupal 8中实现相同目的的方式是什么?

Answers:


25

现在在semaphore表中,键名称为“ cron”。可以通过drush sqlq "DELETE FROM semaphore WHERE name = 'cron';"命令将其删除。

或者,如果可以在Drupal引导环境中执行PHP,则可以运行以下行:

\Drupal::lock()->release('cron');

1
drush php:eval '\Drupal::lock()->release("cron");'
Gogowitsch


5

对于Drupal 8运行:

drush sqlq "DELETE FROM semaphore WHERE name = 'cron';"

1

Drupal 7不再使用cron_semaphore变量,而是使用锁。请参见drupal_cron_run(),特别是以下几行,该功能的一部分。

// Try to acquire cron lock.
if (!lock_acquire('cron', 240.0)) {
  // Omissis
}
// Release cron lock.
lock_release('cron');

将这些行移植到Drupal 8上很简单,因为Drupal 8具有获取和释放锁的服务。

等效代码在中Cron::run()

// Try to acquire cron lock.
if (!$this->lock->acquire('cron', 900.0)) {
  // Omissis
}
// Release cron lock.
$this->lock->release('cron');

如果您需要在无法使用Drush的主机上解锁它(就像我所遇到的那样),要通过引导Drupal的外部脚本实现相同功能,则需要类似以下代码的代码。

use Drupal\Core\DrupalKernel;
use Symfony\Component\HttpKernel\Exception\HttpExceptionInterface;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\Response;
use Drupal\Core\Site\Settings;

chdir('..');

$autoloader = require_once 'autoload.php';

function cron_unlock_access_allowed(Request $request) {
  $account = \Drupal::service('authentication')->authenticate($request);
  if ($account) {
    \Drupal::currentUser()->setAccount($account);
  }
  return \Drupal::currentUser()->hasPermission('administer site configuration');
}

try {
  $request = Request::createFromGlobals();
  $kernel = DrupalKernel::createFromRequest($request, $autoloader, 'prod');
  $kernel->prepareLegacyRequest($request);
}
catch (HttpExceptionInterface $e) {
  $response = new Response('', $e->getStatusCode());
  $response->prepare($request)->send();
  exit;
}

\Drupal::moduleHandler()->addModule('system', 'core/modules/system');
\Drupal::moduleHandler()->addModule('user', 'core/modules/user');
\Drupal::moduleHandler()->load('system');
\Drupal::moduleHandler()->load('user');

if (cron_unlock_access_allowed($request)) {
  \Drupal::lock()->release('cron');
  $status_code = 200;
}
else {
  $status_code = 403;
}
$response = new Response('', $status_code);
$response->prepare($request)->send();

我修改了authorize.php的代码。我更改了运行脚本所需的用户权限,该脚本放置在cron_cleanup.php文件中的包含authorize.php文件的目录中。

如果您可以运行Drush,它将变得更加容易。(请参阅@dman的答案。)


0

当我的D7安装卡住时,转到此页面。我通过使用释放了它

php-eval“ drupal_cron_cleanup()”


问题是针对Drupal 8,而不是Drupal7。此外,在Drupal 7中,该功能被标记为已弃用。
kiamlaluno

实际上,Drupal 7本身用于lock_release('cron')释放cron锁。
kiamlaluno

0

如果您不能按照上面建议的步骤在Drupal 8中使用它-也许您正在使用Redis之类的东西,并且cron锁存储在此处。在这种情况下,您可以进行以下操作:

drush php-eval '\Drupal::service("lock")->release("all")'
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.