Serbest bırakma cron kilidi


15

Cron'u çalıştırdım ve infazı iptal ettim. Şimdi bu mesajı alıyorum:

Zaten çalışırken cron'u yeniden çalıştırmayı denemek.

Drupal 7'de cron_semaphore değişkenini silebilirdim .

Drupal 8'de bunu başarmanın yolu nedir?

Yanıtlar:


25

Şimdi semaphoreanahtar adı "cron" olan tabloda. Bu bir drush sqlq "DELETE FROM semaphore WHERE name = 'cron';"komutla kaldırılabilir .

Veya, Drupal önyüklemeli ortamda PHP'yi yürütebiliyorsanız, satırı çalıştırabilirsiniz:

\Drupal::lock()->release('cron');

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


5

Drupal 8 koşusu için:

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

1

Drupal 7 artık cron_semaphore değişkenini değil, bir kilidi kullanıyor. drupal_cron_run()Bu işlevin bir kısmına ve özellikle aşağıdaki satırlara bakın .

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

Drupal 8'in bir kilidi almak ve serbest bırakmak için bir servisi olduğundan, bu hatları Drupal 8'e taşımak oldukça düzdür.

Eşdeğer kod içinde Cron::run().

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

Eğer Drrupal'ı kullanamayacağınız bir ana bilgisayarda kilidini açmanız gerekiyorsa, bana olduğu gibi, önyükleme Drupal'ın aşağıdakine benzer bir kod gerektireceği harici bir komut dosyasından bunu elde etmek için.

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

I kod adapte authorize.php . Authorize.php dosyasını içeren dizine yerleştirdiğim komut dosyasını çalıştırmak için gereken kullanıcı iznini cron_cleanup.php dosyasında değiştirdim.

Drush'ı çalıştırabilirsen daha kolay olur. (Bkz. @ Dman'ın cevabı .)


0

D7 kurulumum sıkıştığında bu sayfaya geldim. Kullanarak serbest bıraktım

php-eval "drupal_cron_cleanup ()"


Soru Drupal 7 için değil, Drupal 8 içindir. Ayrıca, Drupal 7'de bu işlev kullanımdan kaldırıldı olarak işaretlenmiştir.
kiamlaluno

Aslında, Drupal 7 kendisi lock_release('cron')cron kilidini serbest bırakmak için kullanır .
kiamlaluno

0

Drupal 8'de yukarıda önerilen adımlarla çalışamazsanız - belki Redis gibi bir şey kullanıyorsunuz ve cron kilidi orada saklanıyor. Bu durumda aşağıdakilerle ilerleyebilirsiniz:

drush php-eval '\Drupal::service("lock")->release("all")'
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.