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".
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
Le message d'erreur que vous voyez se produirait si les deux conditions suivantes sont remplies:
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)
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.
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
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.
Voici comment j'ai résolu le problème cron:
name = cron
Pour Drupal 8: drush sqlq "DELETE FROM semaphore WHERE name = 'cron';"
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.
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.