web-dev-qa-db-ja.com

cronロックを解放する

私はcronを実行して実行を中止しました。今私はこのメッセージを受け取ります:

Cronが既に実行されているときにcronを再実行しようとしています。

Drupal 7では、cron_semaphore変数を削除できます。

Drupal 8で同じことを達成する方法は何ですか?

15
Cesar Moore

これはsemaphoreテーブルにあり、キー名は「cron」です。これは、drush sqlq "DELETE FROM semaphore WHERE name = 'cron';"コマンドを使用して削除できます。

または、PHP in Drupalブートストラップ環境で実行できる場合は、次の行を実行できます。

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

おかげで ショーンズの回答 ..

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

助けるようだ!

7
dman

Drupal 8の場合:

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

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's answer を参照してください。)

1
kiamlaluno

上記の推奨手順でDrupal 8で機能しない場合-Redisのようなものを使用していて、そこにcronロックが保存されている可能性があります。この場合、 :

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

D7のインストールが進まなくなったときにこのページに移動しました。使ってリリースしました

php-eval "drupal_cron_cleanup()"

0
Roy Segall