¿Qué es el cron/crontab de Linux?

https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcSuzXWqeyeSKM-yjpR2Ibb6ZSAqTpMd0kg8BNmXJs-LDkHdanWg

¿Qué es cron?

cron es un administrador o planificador de tareas en segundo plano (demonio) que ejecuta procesos a intervalos regulares (cada minuto, hora, día, semana, mes). Los procesos que deben ejecutarse y la hora en la que deben hacerlo se especifican en el fichero crontab. El nombre cron viene del griego chronos que significa “tiempo”.

Cron se podría definir como el “equivalente” a Tareas Programadas de Windows.

Como usuario podemos agregar comandos o scripts con tareas a cron para automatizar algunos procesos. Esto es útil por ejemplo para automatizar la actualización de un sistema, realizar backups, …

¿Cómo funciona?

El demonio cron se inicia de /etc/rc.d/ /etc/init.d dependiendo de la distribución de Linux.

cron se ejecuta en background, revisa cada minuto la tabla de tareas crontab /etc/crontab o en /var/spool/cron en búsqueda de tareas que se deban cumplir.

Los usuarios habilitados para crear su fichero crontab se especifican en el fichero cron.allow. De manera análoga, los que no lo tienen permitido figuran en cron.deny. Estos dos últimos ficheros se encuentran en /etc/cron.d/, o /etc/, dependiendo de la versión de Unix.

¿Qué es crontab?

crontab es un simple archivo de texto que guarda una lista de comandos a ejecutar en un tiempo especificado por el usuario. crontab verificará la fecha y hora en que se debe ejecutar el script o el comando, los permisos de ejecución y lo realizará en el background. Cada usuario puede tener su propio archivo crontab, de hecho el /etc/crontab se asume que es el archivo crontab del usuario root, cuando los usuarios normales (e incluso root) desean generar su propio archivo de crontab, entonces utilizaremos el comando crontab.

Directorios predefinidos, hourly, daily, weekly y monthly


Linux viene con unos directorios predefinidos para que cron los lee y ejecute lo que hay dentro en los intervalos que su nombre indica:

/etc/cron.daily

/etc/cron.hourly

/etc/cron.weekly

/etc/cron.monthly

Dichos directorios se suelen utilizar para crear enlaces simbólicos a directorios, por ejemplo, creamos un script y lo guardamos en /root/bin, y le damos permisos de ejecución, y lo enlazamos en /etc/cron.hourly, cron lo ejecutará cada hora:

chmod +x /home/usuario/scripts/mi-script.sh

ln -s /home/usuario/scripts/mi-script.sh /etc/cron.hourly

Comprobación de si cron está en ejecución

Ejemplos crontab

Vamos a automatizar la actualización de un sistema.

Primero que nada haremos un script. Este script será llamado por cron y contendrá todas las instrucciones que queremos que haga, por lo tanto es necesario probarlo en varios casos y de varias formas antes de incluirlo a cron, un sencillo script de actualización como este:

Guardamos el script como actualizacion.sh (ej. directorio scripts tu home). Cambiamos los permisos de ejecución del dichoso script con:

Ejecutamos el script para verificar que todo ejecute sin problemas, modificamos lo necesario (no debe contener errores, si no cron solo repetirá un error una y otra vez). Ahora a agregar la tarea a nuestro crontab.

Agregar tareas a crontab

IMPORTANTE: este manual se ha realizado para Debian

crontab -e // Editar el archivo crontab del usuario, cada línea nueva será una nueva tarea de crontab.

crontab -l // Lista todas las tareas de crontab del usuario

crontab -r // Borra el crontab del usuario

Ejecutamos la edición del crontab con crontab -e. El archivo crontab lucirá algo así.

# m h dom mon dow user command

Dónde:

  • m corresponde al minuto en que se va a ejecutar el script, el valor va de 0 a 59
  • h la hora exacta, se maneja el formato de 24 horas, los valores van de 0 a 23, siendo 0 las 12:00 de la medianoche.
  • dom hace referencia al día del mes, por ejemplo se puede especificar 15 si se quiere ejecutar cada día 15.
  • mon mes
  • dow significa el día de la semana, puede ser numérico (0 a 7, donde 0 y 7 son domingo) o las 3 primeras letras del día en inglés: mon, tue, wed, thu, fri, sat, sun.
  • user define el usuario que va a ejecutar el comando, puede ser root, u otro usuario diferente siempre y cuando tenga permisos de ejecución del script.
  • command refiere al comando o a la ruta absoluta del script a ejecutar, ejemplo: /home/usuario/scripts/actualizar.sh, si acaso llama a un script este debe ser ejecutable.

http://telecogeek.com/wp-content/uploads/2013/08/cron-linux-tareas-peri%C3%B3dicas.png

La siguiente web viene muy bien para ayudarnos con los números, http://cron.nmonitoring.com/cron-generator.html

Ejemplos:

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

15 10 * * * usuario /home/usuario/scripts/actualizar.sh

15 22 * * * usuario /home/usuario/scripts/actualizar.sh

2. Mostrará el mensaje los domingos a las 10:00 a.m

00 10 * * 0 root echo “CHOCOLATE Y CHURROS” | wall

3. Usuario root ejecutará el comando echo todos los domingos (sun) a las 10:45 a.m

45 10 * * sun root echo “CHOCOLATE Y CHURROS” | wall

4. El día 20 de noviembre a las 7:30 el usuario correrá el script

30 7 20 11 * usuario /home/usuario/scripts/actualizar.sh

5. El día 11 de noviembre a las 7:30 a.m. y que sea domingo, el usuario festejará su cumpleaños.

30 7 11 11 sun usuario /home/usuario/scripts/cumpleanos.sh

6. Un molesto recordatorio cada minuto de cada hora todos los días (NO recomendable).

01 * * * * usuario /home/usuario/scripts/molestorecordatorio.sh

Igual se pueden manejar rangos especiales:

7. A las 5:30 de la tarde todos los días de lunes a viernes.

30 17 * * 1,2,3,4,5

OTRA FORMA

30 17 * * 1-5

8. A las 12 del día todos los días primero, quince y 28 de cada mes (ideal para nóminas)

00 12 1,15,28 * *

9. Si esto resulta confuso, crontab maneja cadenas especiales para definir estos rangos.

@reboot Ejecuta una vez, al inicio
@yearly ejecuta sólo una vez al año: 0 0 1 1 *
@annually igual que @yearly
@monthly ejecuta una vez al mes, el día primero: 0 0 1 * *
@weekly Semanal el primer minuto de la primer hora de la semana. 0 0 * * 0″.
@daily diario, a las 12:00A.M. 0 0 * * *
@midnight igual que @daily
@hourly al primer minuto de cada hora: 0 * * * *

Su uso es muy sencillo. Meter en crontab las siguientes líneas.

@hourly usuario /home/usuario/scripts/molestorecordatorio.sh

@monthly usuario /home/usuario/scripts/respaldo.sh

@daily root apt-get update && apt-get -y upgrade

http://lghttp.nex.nexcesscdn.net/803313/static/images/blog/2014-01-30/cron-job.png

Ejercicios Cron

1. Comprueba que se está ejecutando el demonio cron, si no lo estuviera, ¿cómo podrías iniciarlo?

2. Programa una tarea que imprima en todos los terminales (“Viva Albacete”) todos los lunes a las 9:00.

3. Igual que el punto anterior pero sólo los lunes de meses impares.

4. Programa una tarea dentro de cinco minutos de la hora y fecha actuales, con crontab que cree un fichero sin contenido llamado temp en tu directorio HOME. Dicha tarea se debe realizar siempre a esta hora de Lunes a Viernes los meses de verano (Junio, Julio, Agosto, Septiembre)

5. Programa una tarea que haga una compresión del /home/usuario/redes en un archivo llamado backup en /home/usuario y luego lo mueva a home/usuario/copias todos los viernes a las 17:30h).

6. En vuestro Cpanel, realizar un cron que haga la copia de seguridad de vuestro wordpress, todos los viernes a las 23:30h

REFERENCIAS

http://es.wikipedia.org/wiki/Cron_%28Unix%29

Deja un comentario

Este sitio web utiliza cookies para que usted tenga la mejor experiencia de usuario. Si continúa navegando está dando su consentimiento para la aceptación de las mencionadas cookies y la aceptación de nuestra política de cookies ACEPTAR

Aviso de cookies