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..
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.
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:
Aquí hay un trabajo cron simple:
10 * * * * / usr / bin / php /www/virtual/username/cron.php> / dev / null 2> & 1
Hay dos partes principales:
El comando en sí en este ejemplo tiene tres partes:
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:
Aquí hay una ilustración:
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..
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]
Hay algunas formas diferentes de crear y administrar sus trabajos cron..
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..
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
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..
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
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
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
Si no maneja la salida del script cron, los enviará como correo electrónico a su cuenta de usuario en el servidor.
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".
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
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
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..
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.
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!
¿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.