Déverrouiller le verrou cron


15

J'ai couru cron et avorté l'exécution. Maintenant, je reçois ce message:

Tentative de réexécuter cron alors qu'il est déjà en cours d'exécution.

Dans Drupal 7, je pouvais supprimer la variable cron_semaphore .

Quelle est la façon d'obtenir la même chose dans Drupal 8?

Réponses:


25

Il est maintenant dans le semaphoretableau avec le nom de clé "cron". Cela peut être supprimé via une drush sqlq "DELETE FROM semaphore WHERE name = 'cron';"commande.

Ou, si vous pouvez exécuter PHP dans un environnement bootup Drupal, vous pouvez exécuter la ligne:

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

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


5

Pour Drupal 8 run:

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

1

Drupal 7 n'utilise plus la variable cron_semaphore , mais un verrou. Voir drupal_cron_run(), et en particulier les lignes suivantes, une partie de cette fonction.

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

Le portage de ces lignes vers Drupal 8 est assez simple, car Drupal 8 a un service pour obtenir et libérer un verrou.

Le code équivalent est en Cron::run().

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

Si vous devez le déverrouiller dans un hôte où vous ne pouvez pas utiliser Drush, comme cela m'arrive, pour obtenir la même chose à partir d'un script externe qui démarre Drupal, il faudrait un code similaire au suivant.

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

J'ai adapté le code de authorize.php . J'ai modifié l'autorisation utilisateur requise pour exécuter le script, que j'ai placé dans le répertoire contenant le fichier authorize.php, dans le fichier cron_cleanup.php.

Si vous pouvez exécuter Drush, cela devient plus facile. (Voir la réponse de @ dman .)


0

Arrivé sur cette page lorsque mon installation D7 est bloquée. Je l'ai libéré en utilisant

php-eval "drupal_cron_cleanup ()"


La question s'adresse à Drupal 8, pas à Drupal 7. De plus, dans Drupal 7, cette fonction est déclarée obsolète.
kiamlaluno

En fait, Drupal 7 lui-même utilise lock_release('cron')pour libérer le verrou cron.
kiamlaluno

0

Si vous ne parvenez pas à le faire fonctionner dans Drupal 8 avec les étapes suggérées ci-dessus - vous utilisez peut-être quelque chose comme Redis et le verrou cron y est stocké. Dans ce cas, vous pouvez progresser avec:

drush php-eval '\Drupal::service("lock")->release("all")'
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.