크론 잠금 해제


15

나는 cron을 실행하고 실행을 중단했다. 이제이 메시지가 나타납니다.

cron이 이미 실행중인 동안 다시 실행하려고합니다.

Drupal 7에서 cron_semaphore 변수를 삭제할 수 있습니다.

Drupal 8에서이를 달성하는 방법은 무엇입니까?

답변:


25

이제 semaphore키 이름이 "cron"인 테이블에 있습니다. 이것은 drush sqlq "DELETE FROM semaphore WHERE name = 'cron';"명령을 통해 제거 할 수 있습니다 .

또는 Drupal 부트 스트랩 환경에서 PHP를 실행할 수 있다면 다음 줄을 실행할 수 있습니다.

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

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

7

Shawns 답변 덕분에 ..

drush php-eval "\Drupal::lock()->release('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를 부트 스트랩하는 외부 스크립트에서 동일한 것을 달성하기 위해 Drush를 사용할 수없는 호스트에서 Drush를 잠금 해제해야하는 경우 다음과 유사한 코드가 필요합니다.

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 7이 아니라 Drupal 8에 관한 것입니다. 또한 Drupal 7에서는 해당 기능이 더 이상 사용되지 않는 것으로 표시되어 있습니다.
kiamlaluno

실제로 Drupal 7 자체는 lock_release('cron')cron 잠금을 해제하는 데 사용 합니다.
kiamlaluno

0

Drupal 8에서 위의 제안 단계를 수행하지 못하면 Redis와 같은 것을 사용하고 cron 잠금 장치가 저장되어 있습니다. 이 경우 다음을 진행할 수 있습니다.

drush php-eval '\Drupal::service("lock")->release("all")'
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.