web-dev-qa-db-fra.com

Déverrouiller le verrou cron

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?

15
Cesar Moore

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

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

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

Merci à Réponse de Shawns ..

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

Semblait aider!

7
dman

Pour Drupal 8 run:

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

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 dans 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 nécessiterait 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 @ réponse de dman .)

1
kiamlaluno

Si vous ne pouvez pas le faire fonctionner dans Drupal 8 avec les étapes suggérées ci-dessus - peut-être que vous utilisez 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")'
0
Bernhard Zürn

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

php-eval "drupal_cron_cleanup ()"

0
Roy Segall