क्रोन लॉक जारी करें


15

मैंने क्रोन चलाया और निष्पादन को समाप्त कर दिया। अब मुझे यह संदेश मिला:

पहले से ही चल रहे क्रोन को फिर से चलाने का प्रयास किया जा रहा है।

Drupal 7 में, मैं cron_semaphore वैरिएबल को हटा सकता हूं ।

Drupal 8 में समान हासिल करने का तरीका क्या है?

जवाबों:


25

यह अब semaphoreप्रमुख नाम "क्रोन" के साथ तालिका में है । इसे एक drush sqlq "DELETE FROM semaphore WHERE name = 'cron';"कमांड के जरिए हटाया जा सकता है ।

या, यदि आप Drupal बूटस्ट्रैप्ड वातावरण में PHP निष्पादित कर सकते हैं, तो आप लाइन चला सकते हैं:

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

1
drush php:eval '\Drupal::lock()->release("cron");'
गोगोविट्च


5

ड्रुपल 8 रन के लिए:

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

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 का उपयोग नहीं कर सकते हैं, जैसा कि मेरे साथ होता है, तो बाहरी स्क्रिप्ट से समान प्राप्त करने के लिए जो बूटस्ट्रैप 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 का कोड अनुकूलित किया । मैंने स्क्रिप्ट को चलाने के लिए आवश्यक उपयोगकर्ता अनुमति को बदल दिया था, जिसे मैंने निर्देशिका में रखा था, जिसमें cron_cleanup.php फ़ाइल में प्राधिकृत फ़ाइल।

यदि आप ड्रश चला सकते हैं, तो यह आसान हो जाता है। (देखें @ dman का जवाब ।)


0

मेरे D7 इंस्टॉलेशन के अटकने पर इस पेज पर आए। मैंने उपयोग करके इसे जारी किया

php-eval "drupal_cron_cleanup ()"


प्रश्न Drupal 8 के लिए है, Drupal 7 के लिए नहीं। इसके अलावा, Drupal 7 में उस फ़ंक्शन को पदावनत किया गया है।
किमललुनो

वास्तव में, ड्रुपल 7 खुद का उपयोग करता है lock_release('cron') क्रोन लॉक को रिलीज करने के लिए है।
kiamlaluno

0

यदि आप इसे ऊपर से सुझाए गए चरणों के साथ ड्रुपल 8 में काम करने के लिए नहीं प्राप्त कर सकते हैं - शायद आप रेडिस की तरह कुछ का उपयोग कर रहे हैं और क्रोन लॉक वहां संग्रहीत है। इस मामले में आप के साथ प्रगति कर सकते हैं:

drush php-eval '\Drupal::service("lock")->release("all")'
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.