Lösen Sie die Cron-Sperre


15

Ich habe cron ausgeführt und die Ausführung abgebrochen. Jetzt bekomme ich diese Nachricht:

Es wird versucht, cron erneut auszuführen, während es bereits ausgeführt wird.

In Drupal 7 konnte ich die Variable cron_semaphore löschen .

Wie erreichen Sie dasselbe in Drupal 8?

Antworten:


25

Es ist jetzt in der semaphoreTabelle mit dem Schlüsselnamen "cron". Dies kann über einen drush sqlq "DELETE FROM semaphore WHERE name = 'cron';"Befehl entfernt werden .

Wenn Sie PHP in einer Drupal-Bootstrap-Umgebung ausführen können, können Sie die folgende Zeile ausführen:

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

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


4

Für Drupal 8:

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

0

Ich bin auf diese Seite gekommen, als meine D7-Installation steckte. Ich habe es mit freigegeben

php-eval "drupal_cron_cleanup ()"


Die Frage bezieht sich auf Drupal 8 und nicht auf Drupal 7. Außerdem ist diese Funktion in Drupal 7 als veraltet markiert.
kiamlaluno

Tatsächlich gibt Drupal 7 selbst lock_release('cron')die Cron-Sperre frei.
kiamlaluno

0

Drupal 7 verwendet nicht mehr die Variable cron_semaphore , sondern eine Sperre. Siehe drupal_cron_run()insbesondere die folgenden Zeilen, die Teil dieser Funktion sind.

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

Das Portieren dieser Leitungen auf Drupal 8 ist recht einfach, da Drupal 8 einen Dienst zum Erhalten und Freigeben einer Sperre bietet.

Der entsprechende Code ist in Cron::run().

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

Wenn Sie es auf einem Host entsperren müssen, auf dem Sie Drush nicht verwenden können, wie es mir passiert, um dasselbe von einem externen Skript aus zu erreichen, für das Bootstraps Drupal Code ähnlich dem folgenden erfordern würde.

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

Ich habe den Code von authorize.php angepasst . Ich habe die zum Ausführen des Skripts erforderliche Benutzerberechtigung geändert, die ich in das Verzeichnis mit der Datei authorize.php in der Datei cron_cleanup.php gestellt habe.

Wenn Sie Drush ausführen können, wird es einfacher. (Siehe @ dmans Antwort .)


0

Wenn Sie mit den vorgeschlagenen Schritten von oben nicht in Drupal 8 arbeiten können - verwenden Sie vielleicht etwas wie Redis und die Cron-Sperre ist dort gespeichert. In diesem Fall können Sie fortfahren mit:

drush php-eval '\Drupal::service("lock")->release("all")'
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.