it-swarm.com.de

Lösen Sie die Cron-Sperre

Ich lief cron und brach die Hinrichtung ab. Jetzt bekomme ich folgende Nachricht:

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

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

Wie kann man dasselbe in Drupal 8) erreichen?

15
Cesar Moore

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

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

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

Danke an Shawns Antwort ..

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

Schien zu helfen!

7
dman

Für Drupal 8 run:

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

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

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

Das Portieren dieser Zeilen nach Drupal 8 ist ziemlich gerade, da Drupal 8 hat einen Dienst zum Abrufen und Freigeben einer Sperre.

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 mit einem externen Skript zu erreichen, für das bootstraps Drupal würde Code ähnlich dem folgenden erfordern.

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 Benutzerberechtigung geändert, die zum Ausführen des Skripts erforderlich ist, das ich in dem Verzeichnis mit der Datei authorize.php in der Datei cron_cleanup.php abgelegt habe.

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

1
kiamlaluno

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

drush php-eval '\Drupal::service("lock")->release("all")'
0
Bernhard Zürn

Ich bin auf diese Seite gekommen, als meine D7-Installation hängen blieb. Ich habe es mit verwendet

php-eval "drupal_cron_cleanup ()"

0
Roy Segall