Programación de tareas con Cron Jobs

Los Cron Jobs se utilizan para programar tareas para que se ejecuten en el servidor. Se utilizan más comúnmente para automatizar el mantenimiento o la administración del sistema. Sin embargo, también son relevantes para el desarrollo de aplicaciones web. Hay muchas situaciones en las que una aplicación web puede necesitar ciertas tareas para ejecutarse periódicamente. Hoy vamos a explorar los fundamentos de Cron Jobs..

Definiciones

Primero vamos a familiarizarnos con los términos relacionados con este tema..

"Cron" es un programador de trabajos basado en el tiempo en sistemas operativos similares a Unix (Linux, FreeBSD, Mac OS, etc.). Y estos trabajos o tareas se conocen como "Cron Jobs".

Hay un "demonio" cron que se ejecuta en estos sistemas. Un demonio es un programa que se ejecuta en segundo plano todo el tiempo, generalmente iniciado por el sistema. Este daemon cron es responsable de lanzar estos trabajos cron de forma programada.

La programación reside en un archivo de configuración llamado "crontab". Ahí es donde se enumeran todas las tareas y sus temporizadores.

Por qué usar Cron Jobs?

Los administradores del servidor han estado usando trabajos cron durante mucho tiempo. Pero dado que el público objetivo de este artículo son los desarrolladores web, veamos algunos casos de uso de trabajos cron que son relevantes en esta área:

  • Si tiene un sitio de membresía, donde las cuentas tienen fechas de vencimiento, puede programar los trabajos cron para desactivar o eliminar periódicamente las cuentas que hayan pasado su fecha de vencimiento..
  • Puede enviar correos electrónicos diarios.
  • Si tiene tablas de resumen (o vistas materializadas) en su base de datos, pueden actualizarse regularmente con un trabajo cron. Por ejemplo, puede almacenar todos los resultados de páginas web en una tabla, pero otra tabla de resumen puede contener resúmenes de tráfico diarios.
  • Puede expirar y borrar archivos de datos en caché en un cierto intervalo.
  • Puede revisar automáticamente el contenido de su sitio web en busca de enlaces rotos y recibir un informe por correo electrónico regularmente.
  • Puede programar tareas de larga ejecución para ejecutar desde un script de línea de comandos, en lugar de ejecutarlo desde un script web. Me gusta codificar videos o enviar correos electrónicos masivos.
  • Incluso puede realizar algo tan simple como recuperar sus Tweets más recientes, para guardarlos en un archivo de texto..

Sintaxis

Aquí hay un trabajo cron simple:

 10 * * * * / usr / bin / php /www/virtual/username/cron.php> / dev / null 2> & 1

Hay dos partes principales:

  1. La primera parte es "10 * * * *". Aquí es donde programamos el temporizador..
  2. El resto de la línea es el comando como se ejecutaría desde la línea de comandos.

El comando en sí en este ejemplo tiene tres partes:

  1. "/ usr / bin / php". Los scripts PHP usualmente no son ejecutables por sí mismos. Por lo tanto, necesitamos ejecutarlo a través del analizador PHP.
  2. "/www/virtual/username/cron.php". Este es solo el camino al script.
  3. "> / dev / null 2> & 1". Esta parte está manejando la salida del script. Más sobre esto más adelante.

Sintaxis de tiempo

Esta es la primera parte de la cadena de trabajo cron, como se mencionó anteriormente. Determina con qué frecuencia y cuándo se ejecutará el trabajo cron..

Consta de cinco partes:

  1. minuto
  2. hora
  3. dia del mes
  4. mes
  5. día de la semana

Aquí hay una ilustración:

Asterisco

Muy a menudo, verá un asterisco (*) en lugar de un número. Esto representa todos los números posibles para esa posición. Por ejemplo, un asterisco en la posición de minutos lo haría correr cada minuto.

Necesitamos ver algunos ejemplos para entender completamente esta sintaxis..

Ejemplos:

Este trabajo cron se ejecutará cada minuto, todo el tiempo:

 * * * * * [comando]

Este trabajo cron se ejecutará en el minuto cero, cada hora (es decir, un trabajo cron por hora):

 0 * * * * [comando]

Este es también un trabajo cron por hora, pero se ejecuta en el minuto 15 (es decir, 00:15, 01:15, 02:15, etc.):

 15 * * * * [comando]

Esto se ejecutará una vez al día, a las 2:30 am:

 30 2 * * * [comando]

Esto se ejecutará una vez al mes, el segundo día del mes a la medianoche (es decir, el 2 de enero a las 12:00 am, el 2 de febrero a las 12:00 am, etc.):

 0 0 2 * * [comando]

Esto se ejecutará los lunes, cada hora (es decir, 24 veces en un día, pero solo los lunes):

 0 * * * 1 [comando]

Puedes usar múltiples números separados por comas. Esto se ejecutará tres veces cada hora, en los minutos 0, 10 y 20:

 0,10,20 * * * * [comando]

También se utiliza el operador de la división. Esto se ejecutará 12 veces por hora, es decir, cada 5 minutos:

 * / 5 * * * * [comando]

Dash se puede utilizar para especificar un rango. Esto se ejecutará una vez cada hora entre las 5:00 am y las 10:00 am:

 0 5-10 * * * [comando]

También hay una palabra clave especial que le permitirá ejecutar un trabajo cron cada vez que se reinicie el servidor:

 @reboot [comando]

Configurando y administrando Cron Jobs

Hay algunas formas diferentes de crear y administrar sus trabajos cron..

Paneles de control

Muchas empresas de alojamiento web proporcionan paneles de control para sus clientes. Si usted es uno de ellos, puede encontrar una sección en su panel de control para administrar sus trabajos cron..

Editando el Crontab

Al ejecutar este comando se iniciará vi (editor de texto) y le permitirá editar el contenido de crontab:

 crontab -e

Por lo tanto, sería útil estar familiarizado con los comandos básicos de vi, ya que es bastante diferente a cualquier otro editor de texto con el que haya trabajado..

Si solo desea ver el crontab existente sin editarlo, puede ejecutar este comando:

 crontab -l

Para borrar los contenidos del crontab:

 crontab -r

Cargando un archivo

Puede escribir todos sus trabajos cron en un archivo y luego insertarlo en el crontab:

 crontab cron.txt

Tenga cuidado, ya que esto sobrescribirá todos los trabajos cron existentes con el contenido de este archivo, sin advertencia..

Comentarios

Puedes añadir comentarios seguidos del # carácter.

 # Este trabajo cron hace algo muy importante 10 * * * * / usr / bin / php /www/virtual/username/cron.php> / dev / null 2> & 1

Configuración del correo electrónico

Como mencioné anteriormente, de forma predeterminada, los resultados de los crons se envían por correo electrónico, a menos que los descarte o los redirija a un archivo. La configuración de MAILTO le permite establecer o cambiar la dirección de correo electrónico para enviarlos a:

 MAILTO = "[email protected]" # Este trabajo cron hace algo muy importante 10 * * * * / usr / bin / php /www/virtual/username/cron.php> / dev / null 2> & 1

Usando el Analizador PHP

Los scripts CGI son ejecutables por defecto, pero los scripts PHP no lo son. Necesitan ejecutar a través del analizador de PHP. Es por eso que necesitamos poner la ruta al analizador antes de la ruta del script.

 * * * * * / usr / bin / php [ruta al script php]

A veces puede estar en otra ubicación como: "/ usr / local / bin / php". Para averiguarlo, puede intentar ejecutar esto en la línea de comandos:

 que php

Manejando la salida

Si no maneja la salida del script cron, los enviará como correo electrónico a su cuenta de usuario en el servidor.

Salida de descarte

Si coloca "> / dev / null 2> & 1" al final del comando de trabajo cron (o cualquier otro comando), la salida se descartará.

El soporte de cierre (>) se utiliza para redireccionar la salida. "/ dev / null" es como un agujero negro para la salida. Cualquier cosa que vaya allí es ignorada por el sistema..

Esta parte "2> & 1" hace que la salida STDERR (error) se redirija a la salida STDOUT (normal). Así que eso también termina en "/ dev / null".

Salida a un archivo

Para almacenar la salida cron en un archivo, use el corchete de cierre (>) nuevamente:

 10 * * * * / usr / bin / php /www/virtual/username/cron.php> /var/log/cron.log

Eso reescribirá el archivo de salida cada vez. Si desea agregar la salida al final del archivo en lugar de una reescritura completa, use el corchete de cierre doble (>>) en su lugar:

 10 * * * * / usr / bin / php /www/virtual/username/cron.php >> /var/log/cron.log

Scripts ejecutables

Normalmente, debe especificar el analizador al principio del comando como lo hemos estado haciendo. Pero en realidad hay una manera de hacer que los scripts PHP sean ejecutables desde la línea de comandos como un script CGI..

Lo que necesitas es agregar la ruta al analizador como la primera línea del script:

 #! / usr / local / bin / php 

También asegúrese de establecer el chmod apropiado (como 755) para hacer el archivo ejecutable.

Cuando tienes un script ejecutable, el trabajo cron puede ser más corto como esto:

 10 * * * * /www/virtual/username/hello.php

Prevención de la colisión de trabajo de Cron

En algunos casos, es posible que tenga tareas cron frecuentes que se ejecutan, y es posible que no desee que entren en conflicto si se demora más en ejecutarse que la frecuencia en sí.

Por ejemplo, puede tener un trabajo cron en ejecución cada minuto. Sin embargo, de vez en cuando puede tardar más de un minuto en ejecutarse. Esto puede hacer que otra instancia del mismo script cron comience a ejecutarse antes de que termine la anterior. Puede crear demasiados procesos ocupados de esta manera y posiblemente bloquear el servidor si siguen desacelerándose unos a otros, y causan que se creen más procesos con el tiempo ...

Este problema se puede solucionar mediante el bloqueo de archivos y, más específicamente, el tipo de bloqueo de archivos sin bloqueo (LOCK_NB). (Si no está familiarizado con el bloqueo de archivos, le sugiero que lo lea primero).

Puede agregar este código a la secuencia de comandos del trabajo cron:

 $ fp = fopen ('/ tmp / lock.txt', 'r +'); if (! flock ($ fp, LOCK_EX | LOCK_NB)) echo 'No se puede obtener el bloqueo'; salida (-1);  / *… * / Fclose ($ fp);

Con los bloqueos de archivos normales, la llamada a la función flock () bloquearía el script si hubiera un bloqueo existente. Y se liberaría una vez que el bloqueo se haya ido. Sin embargo, con un bloqueo no bloqueante, como en el código anterior, la llamada a la función no detiene el script, pero devuelve FALSE inmediatamente si hay un bloqueo existente. Entonces, en este caso, podemos salir inmediatamente de la secuencia de comandos cuando veamos que hay un bloqueo existente, lo que indica que hay otro trabajo cron actualmente en ejecución..

Bloqueo del acceso web a Cron Jobs

Cuando escribe un trabajo cron en un lenguaje de scripts web como PHP, puede asegurarse de que nadie pueda ejecutarlo simplemente cargándolo desde su navegador. Una opción fácil sería almacenar estos scripts fuera de su carpeta web. Sin embargo, esto puede no ser práctico o preferible para algunos desarrolladores, si desean mantener sus scripts de trabajo cron dentro de sus carpetas de aplicaciones web..

Si coloca todos los scripts de trabajo cron en una carpeta, bloquea el acceso al poner esta línea en un archivo .htaccess:

 Negar todo

O también puede negar el acceso a los scripts de forma individual colocando esta línea al principio:

 if (isset ($ _ SERVER ['REMOTE_ADDR'])) muere ('Permiso denegado');

Esto asegurará que, cuando se acceda al script desde la web, se abortará inmediatamente.

Conclusión

Gracias por leer. Aunque los trabajos cron solo parecen una herramienta solo para los administradores de sistemas, en realidad son relevantes para muchos tipos de aplicaciones web.

Por favor, deje sus comentarios y preguntas, y tenga un gran día!

Escribe un Tutorial Plus

¿Sabía que puede ganar hasta $ 600 por escribir un tutorial PLUS y / o un screencast para nosotros?? Estamos buscando tutoriales detallados y bien escritos sobre HTML, CSS, PHP y JavaScript. Si tiene la habilidad, contacte a Jeffrey en [email protected].

Tenga en cuenta que la compensación real dependerá de la calidad del tutorial final y del screencast.

  • Síganos en Twitter o suscríbase a Nettuts + RSS Feed para obtener los mejores tutoriales de desarrollo web en la web..