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?

Cesar Moore
quelle

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');
Shawn Conn
quelle
1
drush php:eval '\Drupal::lock()->release("cron");'
Gogowitsch
7

Danke an Shawns Antwort ..

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

Schien zu helfen!

dman
quelle
4

Für Drupal 8:

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

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

php-eval "drupal_cron_cleanup ()"

Roy Segall
quelle
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 .)

kiamlaluno
quelle
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")'
Bernhard Zürn
quelle