web-dev-qa-db-fra.com

Cron a cessé de courir; les journaux indiquent: "Tentative de réexécuter cron alors qu'il est déjà en cours d'exécution."

Quelles sont les étapes pour dépanner et résoudre ce problème selon le titre?

Lorsque j'essaie d'exécuter manuellement, j'obtiens une page immédiatement et le message d'erreur "Tentative de réexécuter cron alors qu'il est déjà en cours d'exécution".

11
giorgio79

Le sémaphore cron est probablement verrouillé. Vous pouvez essayer d'appeler drupal_cron_cleanup () de n'importe où dans votre code (qui ne se trouve pas être invoqué par cron) et cela devrait déverrouiller votre variable de sémaphore cron.

Si vous avez configuré le drush dans Drupal 6, vous pouvez également essayer:

$ drush vdel -y cron_semaphore
12
amateur barista

Sommaire

Le message d'erreur que vous voyez se produirait si les deux conditions suivantes sont remplies:

  • Vos tâches cron ne se terminent pas (erreur) ou prennent plus de 4 minutes pour se terminer;
  • Vous appelez cron plus souvent que toutes les 4 minutes (selon votre paramètre crontab, pas le paramètre dans Drupal)

Ce message d'erreur est donc le symptôme d'une tâche cron qui échoue ou prend trop de temps à s'exécuter. (Remarque: je me rends compte que vous avez déjà trouvé le coupable, mais je voulais ajouter une réponse pour les personnes qui trouvent cette page via les recherches, comme je l'ai fait)

Contexte

La première chose à comprendre est de savoir comment les tâches cron Drupal sont exécutées. Le cron Drupal est invoqué à intervalles - soit via un travail cron sur votre serveur, soit après chaque chargement de page si vous utilisez le cron du pauvre qui est la valeur par défaut de Drupal.

Cependant, les tâches cron ne sont pas nécessairement exécutées à chaque appel de cron - il existe un paramètre dans Drupal (la valeur par défaut est 3 heures) qui indique la fréquence à laquelle les tâches cron doivent être exécutées. Mais ce délai de 3 heures s'applique uniquement si les tâches cron se sont terminées avec succès.

Dans Drupal 7, cron utilise les mécanismes de verrouillage de Drupal , qui fournit un système de verrouillage coopératif et consultatif. L'une des caractéristiques de ce système de verrouillage est que les verrous expirent après un certain temps. Dans le cas de cron, il expire après 4 minutes - donc si votre cron est invoqué toutes les 3 minutes et que le travail cron précédent n'était pas terminé à ce moment-là (soit il s'est écrasé, soit était très lent), vous obtiendriez en effet ce message d'erreur .

Le fait que vous définissiez le cron à toutes les 12 heures ne fait aucune différence - car la tâche Drupal cron échoue/prend trop de temps, Drupal le suppose) n'a pas été exécuté, donc tente de l'exécuter à nouveau dès que cron est invoqué. Le délai de douze heures ne s'applique qu'aux cycles cron réussis.

La variable sémaphore cron n'existe plus dans Drupal 7 - c'était pour une ancienne version de Drupal. Dans Drupal 7 il n'y a pas de moyen fiable pour manuellement libérer un verrou, car le backend de verrouillage peut changer - cependant, si vous utilisez le mécanisme de verrouillage principal, vous pouvez libérer les verrous cron en modifiant la base de données:

DELETE FROM semaphore WHERE name = 'cron';

Mais en faisant cela, vous ne répareriez que les symptômes - le problème qui doit être résolu est la raison pour laquelle cron échoue/prend si longtemps à s'exécuter.

19
Alice Heaton

Le cron_semaphore la variable existait dans Drupal 6, mais vous utilisez Drupal 7, donc les verrous du sémaphore ont été déplacés dans une table distincte appelée semaphore .

La solution pour déverrouiller le sémaphore cron serait donc:

Drupal 7

drush sqlq "TRUNCATE semaphore"

Drupal 6

drush -y vdel cron_semaphore 
4
kenorb

Vous pouvez déboguer le cron en utilisant le module Cron Debug .

Cron Debug vous aidera à trouver des processus cron qui

  • échec en raison d'erreurs de programmation ou d'exécution
  • time out (PHP, serveur, base de données)
  • sont très lents

Cron Debug vous permettra également de tester l'exécution de fonctions cron spécifiques sans en exécuter d'autres. Cela peut être utile pour développer des fonctions cron où vous ne voulez pas exécuter un cron.php complet avec toutes les tâches de maintenance, alertes et autres chaque fois que vous testez votre propre fonction.

2
Nishant

Voici comment j'ai résolu le problème cron:

  1. Via PhpMyAdmin, j'ai regardé dans la table des sémaphores et supprimé la ligne où name = cron
  2. J'ai exécuté "drush cron" via la ligne de commande
  3. J'ai vu un message d'erreur qui m'a donné un indice du problème; cela peut être différent pour vous, mais pour moi, un module récemment désinstallé qui partageait une bibliothèque PHP avec un module installé provoquait une erreur
1
albertski

Pour Drupal 8: drush sqlq "DELETE FROM semaphore WHERE name = 'cron';"

0
Diana

On Drupal 7, comme encore une autre option,

Via drush cron Je devenais,

WD cron: Attempting to re-run cron while it is already running.       [warning]
Cron run failed.                                                      [error]

C'était sur l'environnement de développement et s'est produit parce qu'un cron précédent était en cours d'exécution et a été interrompu.

Sur includes/common.inc, à la ligne 5413, ou aux alentours, vous trouverez ce bloc, https://cgit.drupalcode.org/drupal/tree/includes/common.inc?h=7.x#n541 =

  // 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);
  }

Modifiez le if avec un && FALSE,

  // Try to acquire cron lock.
  if (!lock_acquire('cron', 240.0) && FALSE) {
    // Cron is still running normally.
    watchdog('cron', 'Attempting to re-run cron while it is already running.', array(), WATCHDOG_WARNING);
  }

Et relancez cron. Cela lui permettra de fonctionner.

Veuillez ne pas déployer cela et revenir en arrière une fois terminé. Il aide également au débogage.

0
rovr138

Je me suis heurté à cela plusieurs fois. Dans Drupal 6 Si vous n'utilisez pas drush, vous pouvez le réparer comme ceci:

1 Supprimez les variables cron_% de la table des variables.

SELECT * FROM variable WHERE name like "cron%";

DELETE FROM variable WHERE name like "cron%";

2 effacer Drupal cache dans:/admin/settings/performance

en appuyant sur le bouton "Effacer les données en cache" en bas de la page.

3 exécutez cron depuis le panneau d'administration/admin/reports/status/run-cron ne l'exécutez pas depuis la ligne de commande car cela peut causer des problèmes.

4 Vérifiez que la prochaine exécution automatique du cron se termine normalement.

0
munkiepus