ปลดล็อค cron


15

ฉันวิ่ง cron และยกเลิกการประหารชีวิต ตอนนี้ฉันได้รับข้อความนี้:

กำลังพยายามเรียกใช้ cron อีกครั้งในขณะที่กำลังทำงานอยู่

ใน Drupal 7 ฉันสามารถลบ ตัวแปรcron_semaphore

วิธีในการบรรลุเป้าหมายเดียวกันใน Drupal 8 คืออะไร

คำตอบ:


25

ตอนนี้อยู่ในsemaphoreตารางด้วยชื่อคีย์ "cron" สามารถลบออกได้ด้วยdrush sqlq "DELETE FROM semaphore WHERE name = 'cron';"คำสั่ง

หรือถ้าคุณสามารถรัน PHP ในสภาพแวดล้อม bootstrapped Drupal คุณสามารถเรียกใช้บรรทัด:

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

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



1

Drupal 7 ไม่ได้ใช้ตัวแปรcron_semaphoreอีกต่อไปแต่เป็นการล็อค ดูdrupal_cron_run()และโดยเฉพาะอย่างยิ่งบรรทัดต่อไปนี้ส่วนหนึ่งของฟังก์ชั่นนั้น

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

การย้ายสายเหล่านี้ไปยัง Drupal 8 ค่อนข้างตรงเนื่องจาก Drupal 8 มีบริการสำหรับการรับและการปลดล็อค

รหัสที่เทียบเท่าคือสิ่งCron::run()ต่อไปนี้

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

หากคุณต้องการปลดล็อกในโฮสต์ที่คุณไม่สามารถใช้ Drush ได้เกิดขึ้นกับฉันเพื่อให้ได้สคริปต์เดียวกันจากภายนอกซึ่ง bootstraps Drupal จะต้องใช้รหัสที่คล้ายกับโค้ดต่อไปนี้

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

ผมดัดแปลงรหัสของauthorize.php ฉันเปลี่ยนสิทธิ์ผู้ใช้ที่จำเป็นในการเรียกใช้สคริปต์ซึ่งฉันวางไว้ในไดเรกทอรีที่มีไฟล์ authorize.php ในไฟล์ cron_cleanup.php

หากคุณสามารถเรียกใช้ Drush ได้ง่ายขึ้น (ดูคำตอบของ @ dman )


0

ไปที่หน้านี้เมื่อการติดตั้ง D7 ของฉันติดอยู่ ฉันปล่อยมันโดยใช้

php-eval "drupal_cron_cleanup ()"


คำถามสำหรับ Drupal 8 ไม่ใช่ Drupal 7 นอกจากนี้ใน Drupal 7 ที่ฟังก์ชันถูกคัดค้าน
kiamlaluno

ในความเป็นจริง Drupal 7 ใช้lock_release('cron')เพื่อปลดล็อค cron
kiamlaluno

0

หากคุณไม่สามารถทำให้มันทำงานใน Drupal 8 ด้วยขั้นตอนที่แนะนำจากด้านบน - บางทีคุณอาจกำลังใช้บางอย่างเช่น Redis และ cron lock ถูกเก็บไว้ที่นั่น ในกรณีนี้คุณสามารถดำเนินการกับ:

drush php-eval '\Drupal::service("lock")->release("all")'
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.