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:
- 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:
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”. - 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:
- 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
- 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
Añadimos un email para que nos llegue un aviso cada vez que se ejecute, y finalmente cumplimentamos el formulario:
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:
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!
Escribir comentario