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?
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?
Odpowiedzi:
Teraz jest w semaphore
tabeli 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');
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 .)
Dotarłem do tej strony, gdy moja instalacja D7 utknęła. Wydałem go za pomocą
php-eval "drupal_cron_cleanup ()"
lock_release('cron')
do zwolnienia blokady cron.
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")'
drush php:eval '\Drupal::lock()->release("cron");'