Lepaskan kunci cron

15

Saya berlari cron dan membatalkan eksekusi. Sekarang saya menerima pesan ini:

Mencoba menjalankan ulang cron saat sedang berjalan.

Di Drupal 7, saya bisa menghapus variabel cron_semaphore .

Apa cara untuk mencapai hal yang sama di Drupal 8?

Cesar Moore
sumber

Jawaban:

25

Sekarang ada di semaphoretabel dengan nama kunci "cron". Ini dapat dihapus melalui drush sqlq "DELETE FROM semaphore WHERE name = 'cron';"perintah.

Atau, jika Anda dapat menjalankan PHP di lingkungan bootstrap Drupal, Anda dapat menjalankan baris:

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

Terima kasih untuk jawaban Shawn ..

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

Tampaknya membantu!

dman
sumber
5

Untuk Drupal 8 run:

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

Drupal 7 tidak lagi menggunakan variabel cron_semaphore , tetapi sebuah kunci. Lihat drupal_cron_run(), dan khususnya baris berikut, bagian dari fungsi itu.

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

Porting jalur tersebut ke Drupal 8 cukup lurus, karena Drupal 8 memiliki layanan untuk mendapatkan dan melepaskan kunci.

Kode yang setara ada di Cron::run().

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

Jika Anda perlu membuka kuncinya di host di mana Anda tidak dapat menggunakan Drush, seperti yang terjadi pada saya, untuk mencapai hal yang sama dari skrip eksternal yang bootstraps Drupal akan memerlukan kode yang mirip dengan yang berikut.

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

Saya mengadaptasi kode authorize.php . Saya mengubah izin pengguna yang diperlukan untuk menjalankan skrip, yang saya tempatkan di direktori yang berisi file authorize.php, dalam file cron_cleanup.php.

Jika Anda dapat menjalankan Drush, itu menjadi lebih mudah. (Lihat jawaban @ dman .)

kiamlaluno
sumber
0

Sampai di halaman ini ketika instalasi D7 saya macet. Saya merilisnya dengan menggunakan

php-eval "drupal_cron_cleanup ()"

Roy Segall
sumber
Pertanyaannya adalah untuk Drupal 8, bukan Drupal 7. Selanjutnya, dalam Drupal 7 fungsi tersebut ditandai tidak digunakan lagi.
kiamlaluno
Bahkan, Drupal 7 sendiri digunakan lock_release('cron')untuk melepaskan kunci cron.
kiamlaluno
0

Jika Anda tidak bisa menjalankannya di Drupal 8 dengan langkah-langkah yang disarankan dari atas - mungkin Anda menggunakan sesuatu seperti Redis dan kunci cron disimpan di sana. Dalam hal ini Anda dapat maju dengan:

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