domingo, 17 de enero de 2016

Configurar trabajo para ejecutar tareas programadas de Magento 1.9 en Ubuntu


Para que se puedan ejecutar todas las tareas programadas de Magento 1.9.1 Community Edition (entre ellas el envío de correos usando la cola), es necesario programar la ejecución del script Cron.php, ubicado en el directorio de instalación de Magento. Pero antes de programarlo, y para tratar de asegurar y verificar su correcta ejecución, es recomendable hacer los siguientes preparativos:

1. Instalar la extensión AOE Scheduler a través de Magento Connect. Esta extensión nos permitirá programar las tareas dentro de Magento, y observar su historial de ejecución. Aunque en la página web de la extensión dice que es compatible hasta la versión 1.7 de Magento Community Edition, funciona correctamente en Magento 1.9.1.

2. Luego, en el sitio web de administración (backend) de Magento, ingresamos a la opción del menú System > Scheduler > Timeline View.



En esta página podemos observar una línea de tiempo de las tareas programadas de Magento, en un formato de línea de tiempo. Es posible que esté vacía, si no hay ninguna tarea programada por el momento. Para generar un nuevo conjunto de tareas programadas a ejecutar, presionamos el botón Generate Schedule.




3. Después probamos la ejecución del script por sí solo. Para ello, podemos ejecutar el script cron.sh en la terminal de la máquina virtual. Considerando una instalación por defecto de una máquina virtual de Bitnami, este archivo se ubica en /opt/bitnami/apps/magento/htdocs, y podemos ejecutarlo con el usuario bitnami.

$ cd /opt/bitnami/apps/magento/htdocs
$ sh cron.sh

Luego, en el sitio web de administración de Magento, ingresamos nuevamente a la opción Timeline View. Si el script se ejecutó correctamente, se observará que algunas de las tareas programadas aparecen en verde, indicando que fueron ejecutadas correctamente. Nótese que la línea roja indica la hora en la que se cargó la página, por lo que cabe mencionar que si todas las marcas de tareas están después de la línea roja, estas no se habrán ejecutado, y habrá que esperar a que la línea roja alcance alguna de ellas, antes de ejecutar el script cron.sh.


Si no hay ninguna tarea en verde, es posible que el script no se haya podido ejecutar correctamente. En ese caso podemos probar ejecutar directamente el script de PHP, así:

$ php –f cron.php

Si a pesar de ello no se ejecutan las tareas programadas, habrá que revisar si el script no devolvió ningún error durante la ejecución, y si el usuario con el que lo estamos ejecutando es el propietario del archivo. En mi caso, por defecto el propietario del archivo es bitnami, y los permisos del archivo son -rw-r--r--.

4. Como paso intermedio, averiguamos donde se ubica el ejecutable de php que se usa por defecto. Para ello en la terminal ejecutamos el comando:

$ which php

Por defecto en la máquina virtual de Bitnami el ejecutable se ubica en /opt/bitnami/php/bin/php

5. Suponiendo que el script se ejecutó correctamente, procedemos a programar la ejecución del script usando crontab. Para ello, en la terminal de la máquina virtual ejecutamos el comando:

$ crontab –e

Esto nos abrirá (en algún editor de texto) el archivo de tareas programadas de Linux para el usuario actual. En este debemos ingresar la siguiente línea:

*/5 * * * * /opt/bitnami/php/bin/php –f /opt/bitnami/apps/magento/htdocs/cron.php

Con ello se estaría programando la ejecución del script cron.php cada 5 minutos, que es lo que recomiendan usualmente para esta tarea de Magento. Recomiendo dejar una línea en blanco al final del archivo, por si acaso.

En teoría debería ser posible ejecutar el archivo de bash cron.sh en lugar de cron.php, utilizando el ejecutable /bin/sh, así:

*/5 * * * * /bin/sh /opt/bitnami/apps/magento/htdocs/cron.sh

Pero en mi caso generaba un error de Permission Denied, al intentar ejecutar la tarea.

6. Luego, esperamos alrededor de 5 minutos (en realidad la tarea no se ejecuta cada 5 minutos desde que la creamos, sino en los minutos múltiplos de 5, como 4:00 PM, 4:05 PM, 4:10 PM, y así sucesivamente). Finalmente revisamos la ejecución de las tareas, nuevamente revisando la página System > Scheduler > Timeline View desde el sitio web de administrador de Magento. Si la tarea programada se ejecutó correctamente, deberíamos observar más barritas en verde a la derecha de las que se ejecutaron cuando el script se corrió manualmente, según el tiempo establecido.


Si la tarea programada no se está ejecutando, podemos hacer algunos ajustes al comando de crontab, para que nos imprima las salidas estándar y error de la ejecución de la tarea, a archivos de texto, así:

*/5 * * * * /opt/bitnami/php/bin/php –f /opt/bitnami/apps/magento/htdocs/cron.php 1>/tmp/magecronstd.txt 2>/tmp/magecronerr.txt

En este caso, cada vez que se intente ejecutar la tarea, se crearán o sobreescribirán los archivos magecronstd.txt y magecronerr.txt. El segundo es de particular interés, ya que es el que almacena los errores al intentar ejecutar la tarea.
Con la tecnología de Blogger.