5.x common.inc drupal_cron_run()
6.x common.inc drupal_cron_run()
7.x common.inc drupal_cron_run()

Executes a cron run when called.

Do not call this function from a test. Use $this->cronRun() instead.

Return value

bool TRUE if cron ran successfully and FALSE if cron is already running.

5 calls to drupal_cron_run()
CronRunTestCase::testCronCacheExpiration in modules/system/system.test
Tests that hook_flush_caches() is not invoked on every single cron run.
DrupalWebTestCase::setUp in modules/simpletest/drupal_web_test_case.php
Sets up a Drupal site for running functional and integration tests.
install_finished in includes/install.core.inc
Finishes importing files at end of installation.
PollExpirationTestCase::testAutoExpire in modules/poll/poll.test
system_run_automated_cron in modules/system/system.module
Run the automated cron if enabled.


includes/common.inc, line 5385
Common functions that many Drupal modules will need to reference.


function drupal_cron_run() {

  // Allow execution to continue even if the request gets canceled.

  // Prevent session information from being saved while cron is running.
  $original_session_saving = drupal_save_session();

  // Force the current user to anonymous to ensure consistent permissions on
  // cron runs.
  $original_user = $GLOBALS['user'];
  $GLOBALS['user'] = drupal_anonymous_user();

  // Try to allocate enough time to run all the hook_cron implementations.
  $return = FALSE;

  // Grab the defined cron queues.
  $queues = module_invoke_all('cron_queue_info');
  drupal_alter('cron_queue_info', $queues);

  // Try to acquire cron lock.
  if (!lock_acquire('cron', 240.0)) {

    // Cron is still running normally.
    watchdog('cron', 'Attempting to re-run cron while it is already running.', array(), WATCHDOG_WARNING);
  else {

    // Make sure every queue exists. There is no harm in trying to recreate an
    // existing queue.
    foreach ($queues as $queue_name => $info) {

    // Iterate through the modules calling their cron handlers (if any):
    foreach (module_implements('cron') as $module) {

      // Do not let an exception thrown by one module disturb another.
      try {
        module_invoke($module, 'cron');
      } catch (Exception $e) {
        watchdog_exception('cron', $e);

    // Record cron time.
    variable_set('cron_last', REQUEST_TIME);
    watchdog('cron', 'Cron run completed.', array(), WATCHDOG_NOTICE);

    // Release cron lock.

    // Return TRUE so other functions can check if it did run successfully
    $return = TRUE;
  foreach ($queues as $queue_name => $info) {
    if (!empty($info['skip on cron'])) {

      // Do not run if queue wants to skip.
    $callback = $info['worker callback'];
    $end = time() + (isset($info['time']) ? $info['time'] : 15);
    $queue = DrupalQueue::get($queue_name);
    while (time() < $end && ($item = $queue
      ->claimItem())) {
      try {
        call_user_func($callback, $item->data);
      } catch (Exception $e) {

        // In case of exception log it and leave the item in the queue
        // to be processed again later.
        watchdog_exception('cron', $e);

  // Restore the user.
  $GLOBALS['user'] = $original_user;
  return $return;


edurenye’s picture

Use \Drupal::service('cron')->run(); in drupal 8.