Destacados Servidores

¿Cansado de las tareas repetitivas? ¿Qué es cron?

Ales Krivec - Unsplash.com

cron y crontab, programar tareas en Servidor Linux

Al igual que sucede en nuestro cuerpo, un servidor realiza continuamente tareas de las que no somos conscientes. En el cuerpo: respirar, parpadear, los latidos del corazón… Y en un servidor, actualizaciones de software, copias de seguridad, cachear las páginas, etc

Todas esas tareas repetitivas, que se ejecutan continuamente a intervalos regulares, están regidos por un administrador llamado cron.

Pero… ¿para qué necesito programar tareas? En el siguiente artículo te explicaremos porqué usar tareas cron, cómo ver qué tareas hay en ejecución, cómo añadir nuevas y, en caso de no poder añadir más en nuestro servidor, cómo simular un cron.

¡Esperamos que te diviertas aprendiendo y este artículo sea la base para hacer más fácil tu día a día!


 

¿Para qué necesito programar tareas?

Los seres humanos somos animales de costumbres, y cuando ya llevamos cierto tiempo en un entorno o con una tecnología, desarrollamos rutinas:

¿Acaso no visitas siempre las mismas páginas y casi en el mismo orden? ¿Acaso no frecuentas siempre los mismos lugares?

Cuando gestionamos una página web, también terminamos desarrollando rutinas: Ver si hay actualizaciones nuevas, si hay comentarios nuevos, mirar las estadísticas, etc

Si podemos recrear una acción rutinaria con un pequeño script, podremos ejecutar ese script con un cron, y hacer que ya no tengamos que ocuparnos de esa tarea pudiendo invertir el tiempo que le dedicábamos con anterioridad a otras tareas nuevas.

Un ejemplo de ello, es la frecuencia de actualización de un blog o un periódico. En el artículo “¿Con qué frecuencia debo actualizar mi blog?” hablábamos sobre lo beneficioso que supone para el posicionamiento web, y para fidelizar al público, el convertir la actualización de un medio en algo predecible y rutinario, y lógicamente, esa tarea puede reproducirse con un cron.

Pero como esa tarea hay muchas. A continuación algunos ejemplos:

  • Cada vez que publique algo, que aparezca automáticamente en mis redes sociales.
  • Cada vez que un usuario nuevo se registre, que se envíe un mensaje dándole la bienvenida junto a las normas de la comunidad.
  • Cada vez que sea el cumpleaños de algún miembro registrado, no sólo le felicitamos, sino que le habilitamos algún beneficio temporal.
  • Cada noche, verificar las páginas que lleven un tiempo sin ser actualizadas y crear una copia de ellas en HTML, así la web cargará más rápido (Véase: ¿Qué es cachear una página?)

 

¿Qué son cron y crontab?

Cada mañana, miramos la agenda y vemos qué tareas hay pendientes para, posteriormente, realizarlas:

  • Felicitar a mi hermana por su cumpleaños
  • Reunión a las 10:00 con un cliente
  • Llevar a mi hijo al partido de las 21:30
  • Estudiar para el examen de mañana, de 20:00 a 00:00

Pues bien, siguiendo este símil, la agenda donde apuntamos todo lo que hay que hacer, es un archivo de texto en Linux llamado crontab. Y nosotros, el ente que ejecuta dichas tareas, somos el programa cron (del griego, Chronos – Dios del tiempo).

Dicha pareja está diseñada y creada en Unix, y Linux, como hijo de Unix, ha heredado esta funcionalidad.

Como nuestros servidores están funcionando sobre Windows o Linux (mayoritariamente), podemos acceder a crontab y anotar las tareas que queremos que cron realice con cierta periodicidad.

Pero… ¿Y si mi servidor funciona sobre Windows? No hay problema, porque en Windows existe algo muy similar, llamado “Tareas Programadas”.

 

¿Cómo ver qué tareas hay en ejecución?

Os proponemos dos maneras de hacerlo:

  1. A través de un panel de gestión, como cPanel o Plesk. En cPanel, tendremos que loguearnos y pulsar en la categoría Avanzado –> Cron Jobs:cron01
    En el caso de Plesk, el icono estará en nuestro entorno de escritorio directamente, llamándose “Tareas programadas”. Si no apareciese, leer: “No aparece  la opción tareas programadas en Plesk”.
  2. La segunda opción es a través de conexión remota con SSH, de manera que accederemos a nuestro servidor y veremos las tareas programadas ejecutando comandos Linux.

Para ello, nos conectamos por SSH, y ejecutamos los siguientes comandos:

  1. Vemos si cron está activo:
     /etc/rc.d/init.d/crond status

    En el caso de que nos diga que no ha encontrado el archivo, ejecutamos:

    /etc/init.d/crond status

    Esto se debe a que cron puede estar en dos lugares, dependiendo de la versión de la distribución de Linux.

    Independientemente de cuál de los dos comandos haya funcionado, el resultado puede ser:

    crond (pid 507) is running...

    O que nos diga que no está activado. En este último caso, lo ejecutamos con:

    chkconfig --level 35 crond on
    
  2. Ahora que ya tenemos cron activo y funcionando, debemos editar la agenda (crontab) para añadir nuevas tareas:
    cat /etc/crontab

    Y nos mostrará algo como esto:

    SHELL=/bin/bash
    PATH=/sbin:/bin:/usr/sbin:/usr/bin
    MAILTO=root
    HOME=/
    # run-parts 
    
    01 * * * * root run-parts /etc/cron.hourly
    02 4 * * * root run-parts /etc/cron.daily
    22 4 * * 0 root run-parts /etc/cron.weekly
    42 4 1 * * root run-parts /etc/cron.monthly

    Mas allá de cuál de los dos métodos hayamos usado (Panel de gestión o SSH), al acceder a ellos nos habrá mostrado un listado con las tareas programadas que hay en curso.

¿Cómo añadir tareas nuevas?

En cPanel:

Avanzado –> Cron Jobs

cron01

Añadimos un email para que nos llegue un aviso cada vez que se ejecute, y finalmente cumplimentamos el formulario:

cron02

Donde minuto, hora, día, mes y día de la semana, marcan el momento exacto en el que se va a ejecutar la tarea.

Si queremos que se ejecute cada día, cada mes, etc pondremos un asterisco “*
En el ejemplo, la tarea se ejecutará todos los días a las 00:00h.

Finalmente, en el último campo, introducimos la url del script a ejecutar. Si es un script en php, ponemos php delante.

Ejemplo de servidor si mi script php está en la carpeta “trabajos” y se llama dormir.php, donde USER es vuestro nombre de usuario:

php /home/USER/public_html/trabajos/dormir.php

En Plesk:

El icono estará en nuestro entorno de escritorio directamente, llamándose “Tareas programadas”. Si no apareciese, leer: “No aparece  la opción tareas programadas en Plesk”.

Pulsamos en añadir tarea y nos saldrá lo siguiente:

cron03

Pulsamos en “Activa” y configuramos al gusto.

Para ejecutar un script php como en el ejemplo anterior, marcamos “Ejecutar un script PHP” en comando pondríamos la url donde esté el script, en nuestro ejemplo:

/var/www/vhosts/loopeando.com/httdocs/trabajos/dormir.php

Y seleccionamos la frecuencia de repetición.

Finalmente, podemos ejecutarlo en ese mismo momento para ver que funciona, o bien “aceptar”.

 

Por SSH:

Seguimos los pasos efectuados en el 2do punto del apartado ¿Cómo ver qué tareas hay en ejecución? Para verificar que cron está funcionando, y editar crontab.

Cuando hayamos llegado al punto donde nos quedamos en el apartado anterior, veremos:

SHELL=/bin/bash
PATH=/sbin:/bin:/usr/sbin:/usr/bin
MAILTO=root
HOME=/
# run-parts 
01 * * * * root run-parts /etc/cron.hourly
02 4 * * * root run-parts /etc/cron.daily
22 4 * * 0 root run-parts /etc/cron.weekly
42 4 1 * * root run-parts /etc/cron.monthly
# m h dom mon dow user command

donde:

  • m: minuto en que se va a ejecutar el script, el valor va de 0 a 59
  • h: hora en la que se va a ejecutar el scrip, en formato 24 horas, los valores van de 0 a 23.
  • dom: día del mes, va desde el 1 al 31.
  • dow: Día de la semana en número, valores del 0 al 7, donde 0 y 7 son domingo.
  • user: usuario que va a ejecutar el comando, normalmente root.
  • command: ruta donde está el script a ejecutar. Recordad que la arquitectura variará dependiendo de nuestro servidor. Las más habituales para llegar a la raíz son:

    /var/www/vhosts/tudominio/httdocs/
    /home/USER/public_html/

A continuación algunos ejemplos, basándonos en el supuesto de que la arquitectura de nuestro servidor es la primera que hemos mencionado, y nuestro dominio es loopeando.com. Así mismo, para nuestro ejemplo, vamos a llamar a un script php que se encuentra en la carpeta “trabajos”:

15 10 * * * root /var/www/vhosts/loopeando.com/httdocs/trabajos/dormir.php

Ejecutará el script a las 10:15 a.m. todos los días

15 22 * * * root /var/www/vhosts/loopeando.com/httdocs/trabajos/dormir.php

Ejecutará el script actualizar.sh a las 10:15 p.m. todos los días

00 10 * * 0 root /var/www/vhosts/loopeando.com/httdocs/trabajos/dormir.php

Ejecutará el script todos los domingos a las 10:00 a.m

 

Y si no tengo acceso a cron, ¿cómo programo tareas?

Lo ideal es crear un cron virtual es decir, un script en php que emula el funcionamiento del cron, pero que sin embargo no requiere de acceso al servidor.

En este artículo te contamos cómo se hace.

 

¿Te has atascado en algún punto? En los comentarios te ayudamos! Y si te ha gustado el artículo, ¡compártelo!

Cristian Sarabia Martínez

Desde que a principios de los 90 mi padre desempolvó su Spectrum, no he dejado de probar y experimentar con la tecnología.

Enamorado del mundo web, Full Stack Developer de profesión y diseñador por devoción.

Ahora hago mis pinitos en esto del blogging para compartir con vosotros un poquito de todo lo que la comunidad me ha dado.

Escribir comentario

Haz clic aquí para dejar tu comentario