Cron dejó de correr; los registros dicen: "Intentando volver a ejecutar cron mientras ya se está ejecutando".

11

¿Cuáles son los pasos para solucionar y resolver este problema según el título?

Cuando intento ejecutarlo manualmente, aparece una página inmediatamente y aparece el mensaje de error "Intentando volver a ejecutar cron mientras ya se está ejecutando".

giorgio79
fuente
No podía recordar lo que se ve en el db cron, pero un rápido google de "intentar volver a ejecutar cron mientras ya se está ejecutando" me indicó digitaledgesw.com/node/21 , podría aplicar a D7
Jimajamma
Eso es muy extraño Ese mensaje se encuentra exactamente una vez en el código de core, justo después de verificar esa variable (a través de lock_acquire en drupal_cron_run). Si publica más información / síntomas que indican que es realmente diferente, lo volveré a abrir.
mpdonadio
Sugerencia: ¿puede intentar instalar un Drupal nuevo y configurar cron para que se ejecute cada 3 minutos y ver si tiene el mismo efecto!
Aboodred1
Sólo tiene que ejecutar:drush sqlq "DELETE FROM semaphore WHERE name = 'cron';"
kenorb
44
A FUTUROS LECTORES: La respuesta actualmente aceptada no es correcta para Drupal 7, la versión de Drupal para la cual es la pregunta. Es válido para Drupal 6, pero el código de Drupal 7 cambió; Simplemente sucede que Drupal 7 tiene restos de Drupal 6 que no se han limpiado.
kiamlaluno

Respuestas:

12

El semáforo cron probablemente esté bloqueado. Puede intentar llamar a drupal_cron_cleanup () desde cualquier parte de su código (que no es invocado por cron) y eso debería desbloquear su variable de semáforo cron.

Si tiene drush configurado en Drupal 6, también puede probar:

$ drush vdel -y cron_semaphore
barista aficionado
fuente
3
O elimínelo manualmente de la tabla de variables si tiene acceso db en lugar de drush.
Malks
8
No olvide que estos valores se almacenan en caché en la tabla cache_bootstrap.
tostinni
1
cuál es el nombre exacto de la tabla porque no encontré ningún cron_semaphore en la tabla de variables
mohammed amine bourkadi
2
Cuando ejecuto el comando drush anterior, aparece "cron_semaphore no encontrado". ¿Algunas ideas?
Nigel Waters el
1
@NigelWaters El semáforo cron se convirtió en un candado, en Drupal 7, pero drupal_cron_cleanup()parece no actualizarse.
kiamlaluno
19

Resumen

El mensaje de error que está viendo sucederá si se cumplen las dos condiciones siguientes:

  • Los trabajos cron no finalizan (error) o tardan más de 4 minutos en finalizar;
  • Invocas cron con más frecuencia que cada 4 minutos (según la configuración de tu crontab, no la configuración en Drupal)

Por lo tanto, este mensaje de error es un síntoma de una tarea cron que falla o tarda demasiado en ejecutarse. (Nota: me doy cuenta de que ya ha encontrado al culpable, pero quería agregar una respuesta para las personas que encuentran esta página a través de búsquedas, como lo hice)

Antecedentes

Lo primero que hay que entender es cómo se ejecutan las tareas cron de Drupal. El cron de Drupal se invoca a intervalos regulares, ya sea a través de un trabajo cron en su servidor o después de cada carga de página si usa el cron del pobre, que es el valor predeterminado de Drupal.

Sin embargo, las tareas cron no se ejecutan necesariamente cada vez que se invoca cron: hay una configuración en Drupal (el valor predeterminado es 3 horas) que dice con qué frecuencia se deben ejecutar las tareas cron. Pero este retraso de 3 horas solo se aplica si las tareas cron han terminado con éxito.

En Drupal 7, cron utiliza los mecanismos de bloqueo de Drupal , que proporcionan un sistema cooperativo de bloqueo de asesoramiento. Una de las características de este sistema de bloqueo es que los bloqueos caducan después de un cierto tiempo. En el caso de cron, caduca después de 4 minutos, por lo que si su cron se invoca cada 3 minutos y el trabajo cron anterior no había terminado en ese momento (se bloqueó o fue muy lento), de hecho obtendría este mensaje de error .

El hecho de que configure el cron para que sea cada 12 horas no hace la diferencia, ya que la tarea cron de Drupal está fallando / tarda demasiado, Drupal asume que no se ha ejecutado, por lo que intenta ejecutarlo nuevamente tan pronto como se invoque cron. El retraso de doce horas solo se aplica a ejecuciones cron exitosas.

La variable de semáforo cron ya no existe en Drupal 7, esto era para una versión anterior de Drupal. En Drupal 7 no hay una manera confiable de liberar manualmente un bloqueo, porque el backend de bloqueo puede cambiar, sin embargo, si está utilizando el mecanismo de bloqueo central, puede liberar bloqueos cron editando la base de datos:

DELETE FROM semaphore WHERE name = 'cron';

Pero al hacer esto, solo corregirá los síntomas: el problema que debe abordarse es por qué cron falla / tarda tanto en ejecutarse.

Alice Heaton
fuente
Recibo este mensaje, pero cuando ejecuto cron_debug, todos los trabajos cron finalizan con éxito y se ejecutan rápidamente (excepto las actualizaciones principales que tardan ~ 5 segundos). Si el origen de este problema son las rutinas cron lentas o fallidas, ¿por qué cron_debug no las resaltaría?
doub1ejack
1
No sé cómo funciona el módulo cron_debug, por lo que realmente no puedo comentar sobre esto. ¿Cuál es el valor de la variable 'cron_safe_threshold'? ¿Qué datos es la tabla 'semáforo'?
Alice Heaton
1
Esta es la respuesta correcta para Drupal 7. +1 para la explicación detallada.
kiamlaluno
Por cierto, si cron le falla, use los módulos de depuración de Cron para ver en qué módulo cuelga: 9 de cada 10 veces es el módulo de búsqueda. Intente apagar el módulo de búsqueda, luego ejecute cron manualmente y vea qué sucede. Para encontrar los nodos que está tratando de indexar: drupal.stackexchange.com/questions/22825/…
Dan Mantyla
4

La cron_semaphorevariable existía en Drupal 6, pero está utilizando Drupal 7, por lo que los bloqueos del semáforo se movieron a una tabla separada llamada semaphore.

Entonces, la solución para desbloquear el semáforo cron sería:

Drupal 7

drush sqlq "TRUNCATE semaphore"

Drupal 6

drush -y vdel cron_semaphore 
kenorb
fuente
3
Variante "menos extrema" para Drupal 7:drush sql-query "DELETE FROM semaphore WHERE name='cron'"
tanius
2

Puede depurar el cron utilizando el módulo Cron Debug .

Cron Debug te ayudará a encontrar procesos cron que

  • fallar debido a errores de programación o tiempo de ejecución
  • tiempo de espera (PHP, servidor, base de datos)
  • son muy lentos

Cron Debug también le permitirá probar ejecutar funciones cron específicas mientras no ejecuta otras. Esto puede ser bueno para desarrollar funciones cron en las que no desea ejecutar un cron.php completo con todo el mantenimiento, alertas y otras tareas cada vez que prueba su propia función.

Nishant
fuente
1
¡Este módulo fue un salvavidas para mí!
Dan Mantyla
Sí, este módulo es bueno, ayuda a depurar el trabajo cron.
Nishant
1

Así es como resolví el problema de cron:

  1. A través de PhpMyAdmin, busqué en la tabla de semáforos y eliminé la fila donde name = cron
  2. Ejecuté "drush cron" a través de la línea de comando
  3. Vi un mensaje de error que me dio una pista del problema; esto puede ser diferente para usted, pero para mí un módulo recientemente desinstalado que estaba compartiendo una biblioteca PHP con un módulo instalado estaba causando un error
Albertski
fuente
0

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

Diana
fuente
0

En Drupal 7, como incluso otra opción,

A través de lo drush cronque estaba recibiendo,

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

Esto estaba en el entorno de desarrollo y sucedió porque se estaba ejecutando un cron anterior y se interrumpió.

En includes/common.inc, en la línea 5413, o alrededor, encontrará este bloque, 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);
  }

Modificar el ifcon 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);
  }

Y vuelva a ejecutar cron. Eso le permitirá correr.

Por favor, no implemente esto y vuelva a invertirlo una vez que finalice. También ayuda con la depuración.

rovr138
fuente
-1

Me he enfrentado a esto varias veces. En Drupal 6 Si no usas drush puedes arreglarlo así:

1 Elimine las variables cron_% de la tabla de variables.

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

DELETE FROM variable WHERE name like "cron%";

2 borrar el caché de Drupal en: / admin / settings / performance

presionando el botón 'borrar datos en caché' en la parte inferior de la página.

3 ejecute cron desde el panel de administración / admin / reports / status / run-cron no lo ejecute desde la línea de comando ya que esto puede causar problemas.

4 Verifique que la próxima ejecución automática de cron se complete normalmente.

munkiepus
fuente
¡Bienvenido a Drupal Answers! La pregunta es sobre Drupal 7. Eliminar filas de esa tabla de base de datos no tendría mucho efecto.
kiamlaluno
Ah, solo agregué la respuesta, ya que no había dicho específicamente que era para Drupal 7 en el OP. Eso funciona bien para drupal 6, y es más completo que las respuestas habituales de 'eliminar el semáforo'. Supuse que sería útil que alguien terminara aquí desde d6. ¿Eso estuvo mal? Parece que me han marcado para eso.
munkiepus
acaba de actualizar para eliminar el cron de ejecución de la parte de línea de comandos, acaba de descubrir que puede causar problemas
munkiepus
-1

Puede depurar usando xdebug, ejecutar cron desde la interfaz de administración Admin> Configuración> sistema> cron.

Abdulla Abu Zakham
fuente