Zwolnij blokadę cron

15

Uruchomiłem crona i przerwałem egzekucję. Teraz dostaję tę wiadomość:

Próba ponownego uruchomienia crona, gdy jest on już uruchomiony.

W Drupal 7 mogłem usunąć zmienną cron_semaphore .

Jak to osiągnąć w Drupal 8?

Cesar Moore
źródło

Odpowiedzi:

25

Teraz jest w semaphoretabeli z nazwą klucza „cron”. Można to usunąć za pomocą drush sqlq "DELETE FROM semaphore WHERE name = 'cron';"polecenia.

Lub, jeśli możesz uruchomić PHP w środowisku startowym Drupal, możesz uruchomić linię:

\Drupal::lock()->release('cron');
Shawn Conn
źródło
1
drush php:eval '\Drupal::lock()->release("cron");'
Gogowitsch
7

Dzięki Shawns odpowiedź ..

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

Wydawał się pomóc!

dman
źródło
5

Dla uruchomienia Drupal 8:

drush sqlq "DELETE FROM semaphore WHERE name = 'cron';"
pwaterz
źródło
1

Drupal 7 nie używa już zmiennej cron_semaphore , ale blokadę. Zobacz drupal_cron_run(), aw szczególności następujące wiersze, część tej funkcji.

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

Przeniesienie tych linii do Drupala 8 jest dość proste, ponieważ Drupal 8 ma usługę pobierania i zwalniania blokady.

Odpowiednik kodu znajduje się w Cron::run().

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

Jeśli musisz odblokować go na hoście, na którym nie możesz używać Drusha, tak jak mi się zdarza, aby osiągnąć to samo z zewnętrznego skryptu, że Drupal wymagałby kodu podobnego do następującego.

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

Dostosowałem kod authorize.php . Zmieniłem uprawnienia użytkownika wymagane do uruchomienia skryptu, który umieściłem w katalogu zawierającym plik authorize.php, w pliku cron_cleanup.php.

Jeśli potrafisz uruchomić Drush, staje się łatwiejszy. (Zobacz odpowiedź @ dman .)

kiamlaluno
źródło
0

Dotarłem do tej strony, gdy moja instalacja D7 utknęła. Wydałem go za pomocą

php-eval "drupal_cron_cleanup ()"

Roy Segall
źródło
Pytanie dotyczy Drupala 8, a nie Drupala 7. Ponadto w Drupalu 7 funkcja ta jest oznaczona jako przestarzała.
kiamlaluno
W rzeczywistości sam Drupal 7 używa lock_release('cron')do zwolnienia blokady cron.
kiamlaluno
0

Jeśli nie możesz zmusić go do działania w Drupal 8 z sugerowanymi krokami z góry - być może używasz czegoś takiego jak Redis i tam jest przechowywana blokada cron. W takim przypadku możesz przejść do:

drush php-eval '\Drupal::service("lock")->release("all")'
Bernhard Zürn
źródło