Suelte el bloqueo cron

15

Ejecuté cron y aborté la ejecución. Ahora recibo este mensaje:

Intentando volver a ejecutar cron mientras ya se está ejecutando.

En Drupal 7, podría eliminar la variable cron_semaphore .

¿Cuál es la forma de lograr lo mismo en Drupal 8?

Cesar Moore
fuente

Respuestas:

25

Ahora está en la semaphoretabla con el nombre clave "cron". Esto se puede eliminar mediante un drush sqlq "DELETE FROM semaphore WHERE name = 'cron';"comando.

O, si puede ejecutar PHP en el entorno de arranque de Drupal, puede ejecutar la línea:

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

Gracias a Shawns contesta ..

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

Parecía ayudar!

dman
fuente
5

Para ejecutar Drupal 8:

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

Drupal 7 ya no usa la variable cron_semaphore , sino un bloqueo. Vea drupal_cron_run(), y en particular las siguientes líneas, parte de esa función.

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

Portar esas líneas a Drupal 8 es bastante sencillo, ya que Drupal 8 tiene un servicio para obtener y liberar un bloqueo.

El código equivalente está en Cron::run().

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

Si necesita desbloquearlo en un host donde no puede usar Drush, como me sucede a mí, para lograr lo mismo desde un script externo que arranca Drupal requeriría un código similar al siguiente.

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

Adapte el código de authorize.php . Cambié el permiso de usuario requerido para ejecutar el script, que coloqué en el directorio que contiene el archivo authorize.php, en el archivo cron_cleanup.php.

Si puedes ejecutar Drush, se vuelve más fácil. (Ver la respuesta de @ dman ).

kiamlaluno
fuente
0

Llegué a esta página cuando mi instalación de D7 se atascó. Lo lancé usando

php-eval "drupal_cron_cleanup ()"

Roy Segall
fuente
La pregunta es para Drupal 8, no para Drupal 7. Además, en Drupal 7 esa función está marcada como obsoleta.
kiamlaluno
De hecho, Drupal 7 se usa lock_release('cron')para liberar el bloqueo cron.
kiamlaluno
0

Si no puede hacer que funcione en Drupal 8 con los pasos sugeridos desde arriba, tal vez esté usando algo como Redis y el bloqueo cron se almacena allí. En este caso puedes progresar con:

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