Освободить замок cron

15

Я запустил cron и отменил казнь. Теперь я получаю это сообщение:

Попытка повторно запустить cron, пока он уже запущен.

В Drupal 7 я мог удалить переменную cron_semaphore .

Как добиться того же в Drupal 8?

Сезар Мур
источник

Ответы:

25

Теперь он находится в semaphoreтаблице с именем ключа "cron". Это можно удалить с помощью drush sqlq "DELETE FROM semaphore WHERE name = 'cron';"команды.

Или, если вы можете выполнить PHP в среде начальной загрузки Drupal, вы можете запустить строку:

\Drupal::lock()->release('cron');
Шон Конн
источник
1
drush php:eval '\Drupal::lock()->release("cron");'
Гогович
5

Для Drupal 8 запустить:

drush sqlq "DELETE FROM semaphore WHERE name = 'cron';"
pwaterz
источник
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 . Я изменил разрешение пользователя, необходимое для запуска сценария, который я поместил в каталог, содержащий файл authorize.php, в файле cron_cleanup.php.

Если вы можете запустить Drush, это станет проще. (См . Ответ @ dman .)

киамлалуно
источник
0

Добрался до этой страницы, когда моя установка D7 застряла. Я выпустил его с помощью

php-eval "drupal_cron_cleanup ()"

Рой Сегалл
источник
Вопрос касается Drupal 8, а не Drupal 7. Более того, в Drupal 7 эта функция помечена как устаревшая.
kiamlaluno
Фактически, сам Drupal 7 использует lock_release('cron')для освобождения блокировки cron.
kiamlaluno
0

Если вы не можете заставить его работать в Drupal 8 с предложенными выше шагами - возможно, вы используете что-то вроде Redis, и там хранится блокировка cron. В этом случае вы можете прогрессировать с:

drush php-eval '\Drupal::service("lock")->release("all")'
Бернхард Цюрн
источник