Ir al contenido principal

Cómo depurar y solucionar errores en tareas Cron (PHP y cURL)

Actualizado hoy

Las tareas Cron son una herramienta fundamental en cualquier alojamiento web para automatizar procesos: copias de seguridad, envío de boletines, sincronización de stock, etc. Sin embargo, cuando un Cron falla, descubrir por qué puede convertirse en un verdadero dolor de cabeza, ya que al ejecutarse en segundo plano, no vemos los errores en la pantalla.

Antes de entrar en materia, es importante recordar que desde tu panel de control cPanel, en el apartado de Trabajos de Cron (o Cron Jobs), tienes una opción específica para configurar una dirección de correo electrónico.

Allí es donde el servidor enviará por defecto los resultados, avisos o errores cada vez que se ejecute una de tus tareas programadas.

En este artículo, te enseñaremos cómo auditar y depurar tus tareas Cron paso a paso, ya sea que las ejecutes a través de la línea de comandos (CLI) de PHP o mediante cURL. Aprenderás a registrar errores, evitar correos no deseados y confirmar que tus scripts se están ejecutando correctamente.


1. Ejecución y Depuración mediante Archivos PHP (CLI)

La forma más eficiente y directa de ejecutar un script PHP en un Cron es llamando directamente al ejecutable de PHP del servidor.

Un comando básico de ejecución se vería así:

/usr/local/bin/ea-php84 /home/guiasered/cron.guiasered.net/check.php

Un detalle importante: si utilizas este comando básico y el script se ejecuta correctamente sin fallos (y genera alguna salida de texto o output programada en el script, como un echo), el servidor enviará automáticamente un mensaje con ese resultado al correo electrónico que configuraste previamente en cPanel.

Si, por el contrario, la tarea falla y no recibes la información esperada, el primer lugar donde debes buscar es en el archivo error_log que se genera en el directorio raíz de la ejecución (en este caso, /home/guiasered/error_log).

  • Para Depurar Errores en PHP

Si el archivo error_log no te da suficientes pistas, podemos modificar el comando del Cron para forzar a PHP a que nos entregue un registro detallado en un archivo específico. Para ello, utiliza la siguiente estructura:

/usr/local/bin/ea-php84 -d display_errors=On -d log_errors=Off /home/guiasered/cron.guiasered.net/check.php >> /home/guiasered/cron.guiasered.net/cron_error.log 2>&1

¿Qué hace exactamente este comando?

  • -d display_errors=On y -d log_errors=Off: El parámetro -d (define) permite cambiar ajustes de PHP solo para esta ejecución, sin afectar al resto de tu web. Aquí le obligamos a mostrar los errores (On) y le decimos que no los guarde en su archivo típico (Off), para poder capturarlos nosotros mismos.

  • La Redirección de Salida (>> /home/.../cron_error.log): El símbolo >> significa "Añadir" (Append). Le indica al sistema que guarde cualquier mensaje (como un echo o un print) al final de este archivo de texto, sin borrar el historial anterior.

  • El Redireccionamiento de Errores (2>&1): En sistemas Linux existen dos canales principales de salida:

    • El 1 (stdout) para salidas normales/correctas

    • El 2 (stderr) para errores y advertencias.

    El fragmento 2>&1 le dice al sistema: "Toma los errores (canal 2) y envíalos exactamente al mismo lugar (&) que la salida normal (canal 1)".

Resultado: Tanto los mensajes de éxito como los errores fatales acabarán ordenados en tu archivo cron_error.log, el cual se creará dentro del directorio de "cron.guiasered.net" como se ha especificado.


2. Cómo desactivar las notificaciones por correo

Por defecto, los servidores cPanel intentan enviar un correo electrónico cada vez que un Cron genera alguna salida (incluso si es solo un mensaje de éxito). Si tienes un Cron que se ejecuta cada 5 minutos, esto llenará tu bandeja de entrada rápidamente.

Para silenciar por completo la tarea y no recibir notificaciones al correo, debes añadir >/dev/null 2>&1 al final de tu comando original:

/usr/local/bin/ea-php84 /home/guiasered/cron.guiasered.net/check.php >/dev/null 2>&1

(Nota: /dev/null es el equivalente informático a un "agujero negro". Todo lo que se envía allí, desaparece sin dejar rastro).

3. Ejecución y Depuración mediante cURL

Otra forma muy común de ejecutar crons es haciendo una petición web hacia tu script usando cURL. La diferencia fundamental en la depuración con cURL reside en el nivel de información que le pedimos al comando que nos devuelva.

  • Modo Debug (-vL)

Ideal para cuando tu Cron está fallando y necesitas saber por qué.

curl -vL http://cron.guiasered.net/check.php

-v (Verbose): Hace que cURL sea extremadamente "hablador". Te mostrará todo el detrás de escena: la IP a la que conecta, el saludo HTTP, problemas de DNS, certificados SSL y códigos de estado (200 OK, 404 Not Found, 500 Error, etc.).

-L (Location): Si tu página tiene redirecciones (por ejemplo, fuerza el paso de HTTP a HTTPS), cURL las seguirá automáticamente.

-> Para guardar este diagnóstico en un log:

Ejecutar esto en un Cron significa que no veremos la salida en pantalla. Por lo tanto, para no perder toda esta información, podemos volcar el reporte completo en un archivo de texto utilizando el siguiente comando:

curl -vL http://cron.guiasered.net/check.php >> /home/cron.guiasered.net/curl_debug.log 2>&1

Una vez que la tarea programada se ejecute con este comando, solo tienes que dirigirte a la ruta que hemos especificado (/home/cron.guiasered.net/) a través del Administrador de Archivos de cPanel o por FTP. Allí comprobarás que se ha generado automáticamente un archivo llamado curl_debug.log.

Al abrirlo, encontrarás todo el rastro de la conexión paso a paso, lo que te permitirá identificar el error de inmediato.

  • Modo "Silencioso" o Producción (-sL)

Este es el estándar que debes usar una vez que has comprobado que todo funciona correctamente.

curl -sL http://cron.guiasered.net/check.php

-s (Silent): No muestra barras de progreso, advertencias técnicas ni cabeceras. Si tu PHP imprime un "OK", eso será lo único que devuelva.

Comportamiento del correo: En este modo, el sistema solo te enviará un correo electrónico si el script PHP imprime algo en pantalla (por ejemplo, mediante un echo, print_r o un error fatal).

Consejo: Si tu script PHP termina su ejecución sin imprimir ningún texto, cPanel interpretará que no hay nada que informar y no enviará ningún correo.


4. Un truco extra: Registro de ejecución interno en PHP

Independientemente de si usas el ejecutable de PHP o cURL, una excelente práctica para verificar que el Cron se está ejecutando en la fecha y hora correctas es crear un log interno.

Para ello, simplemente añade el siguiente fragmento de código en la parte superior del archivo .php que ejecuta tu Cron:

<?php
// Definimos la ruta donde se guardará el registro
$ruta = '/home/guiasered/cron.guiasered.net/log_ejecucion.txt';

// Creamos un mensaje con la fecha y hora actual
$mensaje = date('Y-m-d H:i:s') . " - El Cron se ejecutó correctamente (OK)\n";

// Guardamos el mensaje en el archivo de forma silenciosa, añadiéndolo al final
file_put_contents($ruta, $mensaje, FILE_APPEND);

// ... (Aquí continúa el resto del código de tu tarea) ...
?>

Con este sencillo código, podrás abrir el archivo log_ejecucion.txt en cualquier momento y ver el historial exacto de cada vez que el servidor procesó tu script.


¿Sigues teniendo problemas con tus tareas programadas?

Contacte con nuestro equipo de soporte técnico para que podamos ayudarte a revisarlo.

¿Ha quedado contestada tu pregunta?