Eliminar archivos error_log con tarea Cron en cPanel

9/2/20241 min read

Cuando se producen determinados errores en el Hosting, como por ejemplo errores PHP, estos errores o avisos se almacenan progresivamente en un archivo llamado error_logque en ocasiones y sin control puede devorar el espacio de tu cuenta de Hosting.

En este artículo te hablo de cómo Eliminar archivos error_log con tarea Cron en cPanel para reducir espacio ocupado en tu cuenta de Hosting.

La solución adecuada es investigar la causa de esos avisos (warnings) o errores fatales colectados en el archivo “error_log” y corregirlos en tu script PHP o CMS, ya que de esta forma los evitarás en situaciones futuras, saneando la aplicación y de paso el espacio de tu Hosting ocupado por este archivo.

Aquí no me voy a enrollar hablándote de “crontab” y el uso de comandos para su control, me centro exclusivamente en explicarte como eliminar los archivos error_log con una tarea cron ¡y punto! ¿te animas a probarlo?

¿Que es error_log?

Básicamente se trata de un archivo donde se van almacenando de forma incremental determinados avisos y errores de PHP que se detectan en scripts o CMS/LMS instalados en una cuenta de Hosting.

Mediante el servidor Apache (usado habitualmente en servidores Unix/Linux para Hosting Web, aunque también en servidores Windows como “Error.Log”), por medio de la directiva ErrorLog se registran los errores que Apache httpd encuentre al procesar solicitudes.

Al final este archivo lo que hace es evidenciar la existencia de errores de distinta naturaleza como:

  • Errores 500 (Internal Server Error).

  • Avisos por archivos faltantes.

  • Avisos o Errores del motor de PHP por fallos en funciones.

  • Errores sintácticos (Parser Errors).

  • Avisos por funciones depreciadas.

  • Errores de Ejecución.

  • Avisos por errores provocados por versiones de PHP incorrectas.

  • Otros.

Estos errores solo se colectan si el archivo php.ini de la cuenta de Hosting incluye directivas activadas como:

php_flag log_errors on

En servidores que lo permitan estas directivas se pueden invocar desde el archivo .htaccess del usuario.

Los archivos de errores error_log normalmente se almacenan en la carpeta raíz de la instalación afectada o en la carpeta de administración del CMS/LMS en cuestión.

Ejemplo de búsqueda realizada en cPanel usando el buscador de archivos del Administrador de Archivos:

Haz clic en la imagen para ampliarla

Estos archivos también pueden ser localizados en carpetas de plugins, extensiones o módulos que puntualmente presenten errores de PHP.

Ejemplos de errores o avisos de error_log

El formato de los errores recogidos por Apache en error_log permite categorizar estos por medio de niveles mediante constantes previamente definidas, de forma que puedan interpretarse con mayor facilidad y discriminar los errores graves de los avisos.

  • E_ERROR: Errores de tiempo de ejecución fatales que detienen la ejecución de scripts PHP, como la falta de memoria o llamar a una función que no existe.

  • E_WARNING: Advertencias en tiempo de ejecución. Un error que no detiene la ejecución de scripts PHP, pero puede hacer que el código no funcione de la forma esperada.

  • E_PARSE: Errores de sintaxis, como paréntesis, o puntos y coma faltantes.

  • E_NOTICE: Avisos que indican posibles errores, como el uso de una variable que no existe en una expresión.

  • E_STRICT: Errores que indican lugares en el código ejecutado que pueden dejar de funcionar en versiones futuras de PHP.

Si analizamos algunos errores comunes que puedes encontrar en error_log, encontramos ejemplos como:

[26-May-2018 19:12:17 UTC] PHP Fatal error: Cannot redeclare wp_crop_image() (previously declared in /home/pruebasw/public_html/buscador/wp-admin/includes/image.php:25) in /home/pruebasw/public_html/buscador/wp-admin/includes/image.php on line 63

Este error hace referencia a la función wp_crop_image() que es la encargada de recortar una imagen a un tamaño dado por el usuario, un plugin o el tema.

[11-Oct-2017 22:43:40 UTC] PHP Fatal error: Cannot redeclare class geodir_loginwidget in /home/pruebasw/public_html/wesearch/wp-content/plugins/geodirectory/geodirectory_widgets.php on line 242

Un error que puede estar causado por la instalación duplicada del plugin GeoDirectory.

Por regla general los errores con la constante E_ERROR como son los de naturaleza PHP Fatal error dejan el sitio con un HTTP error 500 y sin acceso al sitio web.

[27-Jun-2018 20:35:26 UTC] PHP Warning: is_writable(): open_basedir restriction in effect. File(/) is not within the allowed path(s): (/home/wpseguro:/home2/wpseguro:/usr/lib/php:/usr/local/lib/php:/usr/local/php7:/usr/local/php55:/usr/local/php54:/usr/local/php53:/usr/local/php52:/tmp) in /home/wpseguro/public_html/wp-admin/includes/misc.php on line 211

Este caso muestra un aviso de PHP (warning) que indica que hay una restricción a nivel servidor, mediante una directiva de seguridad, para ejecutar funciones is_writable().

La constante es “E_WARNING” que está informando de algo que no necesariamente deja inoperativa la web, pero que puede acarrear incompatibilidades o funcionamiento limitado si se trata de una directiva deshabilitada.

Podría escribir 15 artículos como este solo narrando los errores típicos de PHP que se colectan en error_log y las posibles causas, pero no es el objetivo de este artículo, en el cual no quería ponerme técnico ¡sorry!

Seguro que si indagas tus archivos de errores te da también para escribir un libro.

Crear Tarea Cron para eliminar archivos error_log

La idea de crear una tarea cron es para poder eliminar los archivos error_log que por circunstancias varias pueden dejarte sin espacio el Hosting contratado, principalmente si vas a ausentarte un tiempo, por vacaciones, viaje, etc., y no puedes revisar diariamente los errores recogidos en este archivo para resolverlos.No gestionar a tiempo los archivos de errores y dejar que su tamaño se incremente puede dejar inoperativas todas tus webs y el correo electrónico de tus dominios alojados en el Hosting.

Una tarea cron o cronjob se usa para programar la tarea (valga la redundancia) a ejecutar en el servidor. Dicha tarea puede ser ejecutada mediante un script o comando y se ejecuta usando un demonio (daemon) en segundo plano en el servidor, detrás del cronjob, conocido como crond.

Las tareas cron tienen un formato específico para poder programarse y que se ejecuten en los tiempos especificados.

Algunos ejemplos de Tareas Cron:

  • * * * * * Se ejecuta cada minuto (Ojo, podría afectar a los recursos de tu cuenta de Hosting).

  • 0 * * * * Se ejecuta cada hora.

  • */15 * * * * Se ejecuta cada 15 minutos.

  • 0 */4 * * * Se ejecuta cada 4 horas.

  • 0 2 * * * Se ejecuta cada día a las 02:00 am.

  • 0 17 * * sun,fri Se ejecuta los días de la semana indicados.

  • 0 5,17 * * * Se ejecuta dos veces al día (5 am y 5 pm).

  • 0 17 * * sun Se ejecuta cada domingo a las 5 pm.

  • 0 0 * * 0 Se ejecuta cada domingo a media noche.

La lista podría ser tan enorme como posibilidades de programación tiene crontab, y eso sin contar que se puede anidar la ejecución de varios scripts, se pueden usar condicionales de fecha/hora y un largo etcétera que se escapa del propósito de este artículo.

Centrándome en la tarea cron para eliminar todos los archivos error_log que el script detecte en la cuenta de Hosting.

Proceso resumido para crear un cronjob:

  1. Accede a tu cPanel.

  2. En el apartado “Avanzado” clic en Tareas cron.

  3. En Correo electrónico cron pon un correo válido para notificaciones del cron.

  4. En Agregar nueva tarea cron configura los apartados:

    • Configuración común: Por ejemplo “Una vez a la semana”.

    • Minuto: 0 para que sea a la hora en punto.

    • Hora: 17 para que sea a las 17 horas.

    • Día: Escogemos el viernes para este ejemplo.

    • Mes: * para que sea cada mes.

    • Día de la semana: 5, para que sea los viernes.

    • Comando: Aquí inserta el comando de eliminación de los archivos de errores (ver más abajo ejemplos).

  5. Ahora haz clic en el botón azul Agregar nueva tarea cron. La tarea quedará agregada más abajo en Tareas cron actuales.

Si tienes acceso por SSH a tu Hosting y privilegios para ejecutar comandos, puedes aplicar una búsqueda del archivo “error_log”, por ejemplo:

find /home/*/public_html -type f -name error_log -exec du -sh {} ;

Dónde * es el username de tu cuenta de Hosting, home puede ser home2 (revísalo en tu cPanel) y el resto es para decirle que busque en /public_html y todas las carpetas de nivel inferior y muestre un listado de los archivos “error_log” encontrados.

Si por ejemplo necesitas encontrar solo archivos error_log que tengan un tamaño superior a los 100MB puedes añadir al comando lo siguiente:

-size +100000k

De forma que quede así:

find /home/*/public_html -type f -name error_log -size +100000k -exec du -sh {} ;

Así solo te devolverá los resultados de archivos error_log que superen dicho tamaño, que son los que quizás más te interese eliminar periódicamente.

Hasta aquí todo bien, pero lo que quieres es eliminarlos, entonces yendo al grano, el comando que se le debe añadir a la tarea cron para que localice archivos error_log y los elimine es el siguiente:

find /home/*/public_html -type f -iname error_log -delete

Aquí también puedes jugar con el tamaño de los archivos, como te indiqué antes:

find /home/*/public_html -type f -iname error_log -size +100000k -delete

¿Cómo queda este comando programado por ejemplo para que se eliminen esos archivos los viernes de cada semana a las 5 de la tarde?

0 17 * * fri find /home//public_html -type f -iname error_log -delete

Haz clic en la imagen para ampliarla

Una vez la tarea queda agregada, puedes verla dentro de Tareas cron actuales ya en uso.

Haz clic en la imagen para ampliarla

Las tareas cron actuales se pueden editar y modificar parámetros de programación o el comando, pero no cambiar el correo electrónico de notificación.

Para cambiar el correo electrónico donde se notifiquen posibles errores del cronjob hay que eliminar la tarea y crearla de nuevo con el correo electrónico deseado.

Las tareas cron creada también se pueden eliminar y dejarán automáticamente de ejecutarse.

Monitorizar el funcionamiento de la tarea cron

Las tareas programadas si funcionan, por regla general simplemente se ejecutan y se produce la acción deseada o entra en funcionamiento el script programado y se reciben notificaciones del proceso.

Esto podría llenar tu buzón de correo en caso de que las tareas se ejecuten a diario o de hora en hora por lo que para estos casos es posible que quieras enviar la salida a null y así evitar llenarte de correos de notificaciones.

Está bien recibir las notificaciones al principio, durante el primer o segundo mes, para corroborar que todo funciona con la normalidad deseada, después puedes enviar la salida a null y así evitar recibir correos sin parar por cada ejecución.

Lo puedes hacer añadiendo al final del comando del cronjob lo siguiente:

>/dev/null 2>&1

Es decir, quedaría más o menos así la tarea cron programada con salida a NULL:

0 17 * * fri find /home//public_html -type f -iname error_log -delete >/dev/null 2>&1

¡Listo! ya no recibirás más las notificaciones de esa tarea.

La explicación del porqué:

El parámetro >>/dev/null 2>&1 se utiliza para desactivar el envío automático de correos electrónicos de tareas cron:

> es para redirigir.

/dev/null es un agujero negro donde cualquier información enviada será descartada.

2 es el descriptor de archivo para el error estándar.

& es el símbolo para el descriptor de archivo (sin él, lo siguiente se consideraría un nombre de archivo).

1 es el descriptor de archivo para salida estándar (Standard Out).

Por lo tanto >/dev/null 2>&1 redirige la salida de tu script a /dev/null.

Cuando la ejecución de una tarea cron no concluye por una errónea programación, comandos no soportados o erróneos, sintaxis incorrecta de la tarea o el script a ejecutar no existe o no se puede ejecutar, entonces se recibe un correo electrónico con la salida de la tarea cron que no se ha ejecutado y se muestran datos de las causas para que puedan ser interpretadas y corregidas.

Quizás en estos casos te interese enviarla a un fichero .txt que puedas consultar cuando te convenga sin tener que revisar los correos electrónicos.

>errores-cron.log

Es decir, quedaría más o menos así la tarea cron programada con salida a NULL:

0 17 * * fri find /home//public_html -type f -iname error_log -delete >errores-cron.log

En Internet existen herramientas para exportar las tareas cron a herramientas externas y que ellas sean las encargadas de lanzarlas y de paso tu puedas monitorizarlas, como es el caso de cronitor.io o cronhub aunque casi todas son comerciales (de pago).

No obstante cronhub permite usar el plan gratuito para desarrolladores que incluye 2 monitores de tareas cron, con avisos o alertas por email o a través de Slack.

Para eliminar archivos de errores en tu Hosting no creo que necesites recurrir a servicios externos a menos que seas el rey/reina de los cron y necesitas rizar el rizo y con cPanel te sientas limitad@ para exprimir la herramienta.

Fuente: https://www.webempresa.com/blog