Liberar cron lock

15

Corri cron e abortou a execução. Agora recebo esta mensagem:

Tentativa de executar novamente o cron enquanto ele já estiver em execução.

No Drupal 7, eu poderia excluir a variável cron_semaphore .

Qual é o caminho para conseguir o mesmo no Drupal 8?

Cesar Moore
fonte

Respostas:

25

Agora está na semaphoretabela com o nome da chave "cron". Isso pode ser removido através de um drush sqlq "DELETE FROM semaphore WHERE name = 'cron';"comando.

Ou, se você pode executar o PHP no ambiente de inicialização Drupal, pode executar a linha:

\Drupal::lock()->release('cron');
Shawn Conn
fonte
11
drush php:eval '\Drupal::lock()->release("cron");'
Gogowitsch 14/07/2018
7

Graças à resposta de Shawns ..

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

Parecia ajudar!

dman
fonte
5

Para o Drupal 8, execute:

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

Cheguei a esta página quando minha instalação do D7 travou. Eu o libertei usando

php-eval "drupal_cron_cleanup ()"

Roy Segall
fonte
A questão é para o Drupal 8, não para o Drupal 7. Além disso, no Drupal 7, essa função está marcada como obsoleta.
kiamlaluno
De fato, o próprio Drupal 7 usa lock_release('cron')para liberar o bloqueio do cron.
kiamlaluno
0

O Drupal 7 não usa mais a variável cron_semaphore , mas um bloqueio. Veja drupal_cron_run(), e em particular as seguintes linhas, parte dessa função.

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

A portagem dessas linhas para o Drupal 8 é bastante direta, pois o Drupal 8 tem um serviço para obter e liberar um bloqueio.

O código é em equivalente Cron::run().

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

Se você precisar desbloqueá-lo em um host em que não possa usar o Drush, como acontece comigo, para obter o mesmo de um script externo que inicialize o Drupal, exigiria um código semelhante ao seguinte.

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

Eu adaptei o código do authorize.php . Alterei a permissão do usuário necessária para executar o script, que eu coloquei no diretório que contém o arquivo authorize.php, no arquivo cron_cleanup.php.

Se você pode executar o Drush, fica mais fácil. (Veja a resposta de @ dman .)

kiamlaluno
fonte
0

Se você não conseguir que ele funcione no Drupal 8 com as etapas sugeridas acima - talvez você esteja usando algo como Redis e o bloqueio do cron esteja armazenado lá. Nesse caso, você pode avançar com:

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