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?
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:
Ora è nella semaphore
tabella 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');
Grazie alla risposta di Shawns ..
drush php-eval "\Drupal::lock()->release('cron');"
Sembrava aiutare!
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 .)
Arrivato a questa pagina quando la mia installazione D7 si è bloccata. L'ho rilasciato usando
php-eval "drupal_cron_cleanup ()"
lock_release('cron')
per rilasciare il cron lock.
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")'
drush php:eval '\Drupal::lock()->release("cron");'