Відпустіть замок 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';"

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();

Я адаптував код autize.php . Я змінив дозвіл користувача, необхідний для запуску скрипту, який я розмістив у каталозі, що містить файл autize.php, у файл cron_cleanup.php.

Якщо ви можете запустити Друш, це стає простіше. (Дивіться відповідь @ 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")'
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.