Magento 1.9.1 cron_schedule no se elige para siempre


12

Pasé casi 3 días y no puedo entender y hacer que Magento Cron procese las tareas programadas. Estoy ejecutando Magento 1.9.1.0 y recientemente noté que los correos electrónicos de pedidos ahora están en cola en lugar de enviarse al instante. Entiendo la necesidad pero no puedo hacer que el sistema seleccione las colas.

Aquí está mi visión para Cronjob. ingrese la descripción de la imagen aquí

Aquí está mi línea de comando cronjob. ingrese la descripción de la imagen aquí

Así es como se crean las tareas en la tabla cron_schedule. ingrese la descripción de la imagen aquí

Como los registros se crean en la tabla cron_schedule, creo que el Cron se ejecuta una vez cada 5 minutos. Si elimino manualmente estos registros a través de PhpMyAdmin, los registros se crean automáticamente después de un tiempo.

Pero el estado de las tareas sigue "pendiente" y nunca se completa. No estoy seguro si algo anda mal en mi configuración o si me falta algo. ¿Puede alguien ayudarme a hacer que la tarea programada se ejecute a tiempo? Además, ¿por qué se crean múltiples registros para un código de trabajo?

Actualizar

Limpié toda la tabla y el cron creó los trabajos programados. Todos los trabajos están en estado pendiente y nunca se ejecutan, incluso esperando más de 60 minutos. Algo está mal en Magento 1.9.1

Actualización 11/02: Hoy hice un análisis más sobre el proceso.

Edité el cron.php como se muestra a continuación

echo 'iam before mdefault 1';
shell_exec("/bin/sh $baseDir/cron.sh $fileName -mdefault 1 > /dev/null 2>&1 &");
echo 'iam before malways 1';
shell_exec("/bin/sh $baseDir/cron.sh $fileName -malways 1 > /dev/null 2>&1 &");
echo 'i returned success';

Edité la clase Mage_Cron_Model_Observer como se muestra a continuación

public function dispatch($observer) {
  echo 'iam inside dispath';

Comprendí que cuando el cron ejecuta -mdefault, debería llamar a la función de despacho y se ejecutará. Pero lo que sucedió fue como a continuación en la salida cron.

Content-type: text/html

iam before mdefault 1iam before malways 1i returned success

Significa que el despacho no llama a atall ...

Uno otro intento

Cambié manualmente la variable $isShellDisabled = true;y cambié la siguiente en cron.php.

if ($isShellDisabled) {
  echo 'before always';
  Mage::dispatchEvent('always');
  echo 'after always';
  Mage::dispatchEvent('default');
  echo 'after default';
} else {
  Mage::dispatchEvent($cronMode);
}

La salida cron para lo anterior es la siguiente

Content-type: text/html

before alwaysiam inside dispath alwaysafter always

Ahora se llama 'dispatchAlways' pero no 'dispatch'

Ninguna de las respuestas me ayuda. Nunca escoge las tareas programadas. Es decir, cuando Cron se ejecuta por primera vez, creó con éxito las tareas en la tabla. Pero nunca ejecuta la tarea.


¿Qué sucede cuando ejecutas cron.php desde un navegador web? Será una página en blanco, pero quiero decir, ¿qué pasa con sus tareas cron?
seanbreeden

Intente usar el script bash: */5 * * * * /bin/sh PATH_TO_PRODUCTION/cron.shsi está disponible.
Phil Birnie

@seanbreeden, cuando ejecuto a través de URL en el navegador, muestra una página en blanco. No ha pasado nada con las tareas ...
Actualicé

@PhilB, .sh no hace ninguna diferencia. Es similar que las tareas pendientes están pendientes para siempre, pero estoy seguro de que el cron se ejecuta cada 5 minutos.
Malaiselvan

intentaste vaciar la cron_schedulemesa? Compruebe si se llena con nuevas tareas después de una hora más o menos
Sander Mangel

Respuestas:


3

Era la versión PHP de Cron Jobs.

La versión de PHP se configuró correctamente para el sitio, por eso funcionaba; sin embargo, Cron Jobs se estaba ejecutando en el servidor PHP 5.3 nativo, razón por la cual recibía los errores solo cuando ejecutaba Cron. Actualicé a la versión 5.5.

Comando Cron modificado:

php /home/mydomainname/public_html/cron.php
to
php55 /home/mydomainname/public_html/cron.php

o en hostgator:

/opt/php55/bin/php /home/mydomainname/public_html/cron.php

en cron.php

$isShellDisabled = (stripos(PHP_OS, 'win') === false) ? $isShellDisabled : true;

Después de esta línea, agregue:

$isShellDisabled = true;

La mención de ejecutar cron.php en una versión específica de PHP (ea-php70 en mi caso) solucionó los problemas con los que me encontraba: ejecutar php -ven la terminal para ver qué versión de PHP está usando la terminal. En mi caso fue 5.6. Así que tuve que forzar el uso de PHP 7.0 cambiando phpa ea-php70in crontab -e. ¡Gracias!
Daan van den Bergh el

2

intentaste vaciar la cron_schedulemesa? Compruebe si se llena con nuevas tareas después de una hora más o menos.

También puede usar Aoe_Scheduler para deshabilitar cronjobs específicos. Vea si alguno en particular puede causar un error que detenga todas las demás tareas.

La forma en que los cronjobs de Magento se configuran como un error fatal en un script hará que la ejecución de todas las tareas falle


Gracias por la respuesta. ¿El error fatal capturado en algún registro? Actualicé algunos hallazgos más sobre mi caso y actualicé lo mismo en mi pregunta.
Malaiselvan

@seanbreeden: Hoy noté que cuando lanzo el Cron.php a través del navegador web, funciona muy bien al elegir los horarios. Esto prueba que no hay un error fatal en ninguno de los guiones. ¿Alguna idea de por qué el cron no se ejecuta a través de crontab?
Malaiselvan

2

Como primer paso, sugeriría revertir su configuración a la configuración cron predeterminada de Magento:

Valores predeterminados de Magento Cron

Hay un problema con su configuración actual: su programación se genera cada 15 minutos, pero solo se programa con anticipación durante 5 minutos, lo que deja un intervalo de 10 minutos.


Gracias. Incluso después de restablecer los valores predeterminados, no funciona. Cuando se ejecuta por primera vez, creó todos los trabajos en la tabla cron_schedule con la hora programada. Los trabajos nunca se seleccionan y permanecen en la tabla como pendientes para siempre. Una cosa que noté después de la configuración $isShellDisabled = true;y cuando inicio el Cron.php a través del navegador, los trabajos se seleccionan pero no a través de CronTab.
Malaiselvan

Este problema aún no se ha resuelto. ¿Habrá un problema con mi proveedor de hosting? Veo la secuencia de comandos activada a intervalos regulares, pero solo no se seleccionan los trabajos. ¿También será un problema ya que migré desde 1.8?
Malaiselvan

¿Tu cronjob tiene suficiente memoria? Pruebe los registros de errores para ver si hay algo allí que pueda ayudar.
Kristof en Fooman

Este problema aún no está resuelto ... Todos los días me estoy rompiendo la cabeza. ¿Registros de error? ¿Dónde puedo ver esos?
Malaiselvan

@Malaiselvan para los registros de errores, consulte con el administrador de su sistema o el servidor web, ya que deben conocer la ubicación y cómo acceder al registro de errores del servidor. También podría ser útil ejecutar manualmente el trabajo cron desde la línea de comandos: pruebe ambos php -f cron.phpy ./cron.shvea si producen algo para investigar más a fondo.
Kristof en Fooman

1

El mismo problema para mi.

Se encontró el error "Demasiado tarde ...".

Después de limpiar la cron_scheduletabla, cron.sh dejó de funcionar (ya no se programa).

Funcionó solo después de matar todos los viejos procesos de Cron.


En mi caso, cuando Cron se ejecuta por primera vez, creó con éxito las tareas en la tabla. Pero nunca ejecuta la tarea. :-(
Malaiselvan

1

Yo tuve el mismo problema. Mi problema era específico de la zona horaria: las columnas created_aty scheduled_aten la cron_scheduletabla deberían ser UTC + 0, mis entradas eran UTC + 2.

Para verificar esto, simplemente puede establecer las fechas desde created_aty scheduled_athasta ayer y esperar hasta la próxima programación cron.

Espero que ayude a alguien!


1

En Bluehost, en cron.sh change

 PHP_BIN=`which php`

a

 PHP_BIN="php54s"

Por defecto en el alojamiento compartido, ejecuta PHP 5.2.

También tuve que cambiar cron.php, reemplazando las dos $isShellDisabledlíneas con $isShellDisabled = true;

Para deshacerme de las advertencias de PHP, también agregué estas líneas antes

$_SERVER['SCRIPT_NAME'] = 

if (empty($_SERVER['SCRIPT_FILENAME'])) $_SERVER['SCRIPT_FILENAME'] = '~/public_html/cron.php';
if (empty($_SERVER['SCRIPT_NAME'])) $_SERVER['SCRIPT_NAME'] = '/cron.php';
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.