Rilascia cron lock


15

Ho eseguito cron e interrotto l'esecuzione. Ora ricevo questo messaggio:

Tentativo di rieseguire cron mentre è già in esecuzione.

In Drupal 7, ho potuto eliminare la variabile cron_semaphore .

Qual è il modo per ottenere lo stesso in Drupal 8?

Risposte:


25

Ora è nella semaphoretabella con il nome chiave "cron". Questo può essere rimosso tramite un drush sqlq "DELETE FROM semaphore WHERE name = 'cron';"comando.

Oppure, se è possibile eseguire PHP nell'ambiente bootstrap Drupal, è possibile eseguire la riga:

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

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


5

Per l'esecuzione di Drupal 8:

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

1

Drupal 7 non utilizza più la variabile cron_semaphore , ma un lock. Vedi drupal_cron_run(), e in particolare le seguenti righe, parte di quella funzione.

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

Il porting di queste linee su Drupal 8 è abbastanza semplice, poiché Drupal 8 ha un servizio per ottenere e rilasciare una serratura.

Il codice equivalente è in Cron::run().

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

Se è necessario sbloccarlo in un host in cui non è possibile utilizzare Drush, come accade a me, per ottenere lo stesso da uno script esterno che Bootstrap Drupal richiederebbe un codice simile al seguente.

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

Ho adattato il codice di authorize.php . Ho modificato l'autorizzazione utente richiesta per eseguire lo script, che ho inserito nella directory contenente il file authorize.php, nel file cron_cleanup.php.

Se riesci a eseguire Drush, diventa più facile. (Vedi la risposta di @ dman .)


0

Arrivato a questa pagina quando la mia installazione D7 si è bloccata. L'ho rilasciato usando

php-eval "drupal_cron_cleanup ()"


La domanda è per Drupal 8, non Drupal 7. Inoltre, in Drupal 7 tale funzione è contrassegnata come obsoleta.
kiamlaluno

In effetti, Drupal 7 stesso utilizza lock_release('cron')per rilasciare il cron lock.
kiamlaluno

0

Se non riesci a farlo funzionare in Drupal 8 con i passaggi suggeriti dall'alto, forse stai usando qualcosa come Redis e il cron lock è memorizzato lì. In questo caso puoi procedere con:

drush php-eval '\Drupal::service("lock")->release("all")'
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.