cronロックを解除


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



0

D7のインストールが停止したときにこのページに移動しました。を使用してリリースしました

php-eval "drupal_cron_cleanup()"


問題は、Drupal 7ではなく、Drupal 8です。さらに、Drupal 7では、その機能は非推奨とマークされています。
キアムルノ

実際、Drupal 7自体はlock_release('cron')cronロックを解除するために使用します。
キアムルノ

0

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ファイルのauthorize.phpファイルを含むディレクトリに配置しました。

Drushを実行できれば、簡単になります。(@dmanの回答を参照してください。)


0

上記の推奨手順でDrupal 8で動作しない場合は、おそらくRedisなどを使用しており、そこにcronロックが保存されています。この場合、次の手順を実行できます。

drush php-eval '\Drupal::service("lock")->release("all")'
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.