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."

11

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

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

giorgio79
la source
Je ne me souvenais pas du haut de ma tête de ce que le don cron regarde, mais un rapide google de "tenter de relancer cron alors qu'il est déjà en cours d'exécution" m'a pointé sur digitaledgesw.com/node/21 , cela pourrait appliquer à D7
Jimajamma
C'est très étrange. Ce message se trouve exactement une fois dans le code pour core, juste après une vérification de cette variable (via lock_acquire dans drupal_cron_run). Si vous postez plus d'informations / symptômes qui indiquent qu'il est en effet différent, je le rouvrirai.
mpdonadio
Suggestion: pouvez-vous essayer d'installer un nouveau Drupal et configurer cron pour qu'il s'exécute toutes les 3 minutes et voir si vous avez le même effet !!!
Aboodred1
Il suffit de courir:drush sqlq "DELETE FROM semaphore WHERE name = 'cron';"
kenorb
4
AUX LECTEURS FUTURS: La réponse actuellement acceptée n'est pas correcte pour Drupal 7, la version Drupal pour laquelle la question est. Il est valable pour Drupal 6, mais le code Drupal 7 a changé; il se trouve que Drupal 7 a des restes de Drupal 6 qui n'ont pas été nettoyés.
kiamlaluno

Réponses:

12

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
barista amateur
la source
3
Ou supprimez-le manuellement de la table des variables si vous avez un accès db plutôt que drush.
Malks
8
N'oubliez pas que ces valeurs sont mises en cache dans le tableau cache_bootstrap.
tostinni
1
s'il vous plaît quel est le nom exact de la table car je n'ai trouvé aucun cron_semaphore dans la table des variables
mohammed amine bourkadi
2
Lorsque j'exécute la commande drush ci-dessus, j'obtiens «cron_semaphore not found». Des idées?
Nigel Waters
1
@NigelWaters Le sémaphore cron est devenu un verrou, dans Drupal 7, mais drupal_cron_cleanup()ne semble pas être mis à jour.
kiamlaluno
19

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 réguliers - soit via un travail cron sur votre serveur, soit après chaque chargement de page si vous utilisez le cron du pauvre qui est le 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 de 3 heures) qui indique à quelle fréquence les tâches cron doivent être exécutées. Mais ce délai de 3 heures ne s'applique que 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 sur 12 heures ne fait aucune différence - parce que la tâche cron de Drupal échoue / prend trop de temps, Drupal suppose qu'elle n'a pas été exécutée et essaie 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 aucun moyen fiable de libérer manuellement 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.

Alice Heaton
la source
Je reçois ce message, mais lorsque j'exécute cron_debug, tous les travaux cron se terminent avec succès et s'exécutent rapidement (à l'exception des mises à jour principales qui prennent environ 5 secondes). Si la source de ce problème est des routines cron lentes ou défaillantes, pourquoi cron_debug ne les mettrait-il pas en évidence?
doub1ejack
1
Je ne sais pas comment fonctionne le module cron_debug, donc je ne peux pas vraiment commenter cela. Quelle est la valeur de la variable 'cron_safe_threshold'? Quelles sont les données de la table «sémaphore»?
Alice Heaton
1
Ceci est la bonne réponse pour Drupal 7. +1 pour l'explication détaillée.
kiamlaluno
BTW, si cron échoue pour vous, utilisez les modules Cron Debug pour voir sur quel module il raccroche - 9 fois sur 10 c'est le module de recherche. Essayez de désactiver le module de recherche, puis exécutez cron manuellement et voyez ce qui se passe. Pour trouver les nœuds qu'il essaie d'indexer: drupal.stackexchange.com/questions/22825/…
Dan Mantyla
4

La cron_semaphorevariable existait dans Drupal 6, mais vous utilisez Drupal 7, donc les verrous de 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 
Kenorb
la source
3
Variante "moins extrême" pour Drupal 7:drush sql-query "DELETE FROM semaphore WHERE name='cron'"
tanius
2

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.

Nishant
la source
1
Ce module m'a sauvé la vie!
Dan Mantyla
oui, ce module est bon, il aide à déboguer le travail cron.
Nishant
1

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

  1. Via PhpMyAdmin, j'ai regardé dans le tableau 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
albertski
la source
0

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

Diane
la source
0

Sur Drupal 7, comme encore une autre option,

Via drush cronj'obtenais,

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 autour, vous trouverez ce bloc, https://cgit.drupalcode.org/drupal/tree/includes/common.inc?h=7.x#n5413

  // 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 ifavec 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.

rovr138
la source
-1

Je me suis heurté à cela plusieurs fois. Dans Drupal 6 Si vous n'utilisez pas drush, vous pouvez le corriger 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 Vider le cache Drupal 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.

munkiepus
la source
Bienvenue dans Drupal Answers! La question concerne Drupal 7. La suppression de lignes de cette table de base de données n'aurait pas beaucoup d'effet.
kiamlaluno
Ah j'ai seulement ajouté la réponse car elle n'avait pas dit spécifiquement que c'était pour Drupal 7 dans le PO. Cela fonctionne bien pour drupal 6, et est plus complet que les réponses habituelles «supprimer le sémaphore». j'ai pensé qu'il serait utile que quelqu'un se retrouve ici à partir de d6. C'était mal? Il me semble avoir été marqué pour cela.
munkiepus
vient d'être mis à jour pour supprimer le cron d'exécution de la partie de la ligne de commande, vient de découvrir qu'il peut causer des problèmes
munkiepus
-1

Vous pouvez déboguer en utilisant xdebug, exécuter cron à partir de l'interface d'administration Admin> Configuration> système> cron.

Abdulla Abu Zakham
la source