Utilización de cron en linux


¿Qué es cron?

Cron es el nombre del programa que permite a usuarios Linux/Unix ejecutar automáticamente comandos o scripts (grupos de comandos) a una hora o fecha específica. Es usado normalmente para comandos de tareas administrativas, como respaldos, pero puede ser usado para ejecutar cualquier cosa.

Como se define en las páginas del manual de cron (#> man cron) es un demonio que ejecuta programas agendados.

En prácticamente todas las distribuciones de Linux se usa la versión Vixie Cron, por la persona que la desarrolló, que es Paul Vixie, uno de los grandes gurús de Unix, también creador, entre otros sistemas, de BIND que es uno de los servidores DNS más populares del mundo.

Cron es un demonio (servicio), lo que significa que solo requiere ser iniciado una vez, generalmente con el mismo arranque del sistema. El servicio de cron se llama cron (en kali linux) y crond en otros (como centos si no me equivoco). En la mayoría de las distribuciones el servicio se instala automáticamente y queda iniciado desde el arranque del sistema.

Esta entrada esta basada en el sistema operativo Kali Linux, por lo que algunos comandos y vistas pueden ser diferentes a otras distribuciones de Linux.

Para comprobar el estado del sistema se ejecuta el siguiente comando:

Usos de cron

Existen dos formas de utilizar el servicio de cron.

La primera es en el directorio etc/, donde seguramente encontrarás los siguientes directorios:

Un ejemplo para comprobar es el siguiente script dentro de la carpeta cron.hourly el cual se ejecutará cada 1 hora.

#!/bin/bash
#script de respaldo directorio Documentos de usuario root
cd /root/Documentos/
tar -czf * respaldo.tar.gz

Al crear el script, se deben cambiar los permisos para que el archivo pueda ser ejecutado.

chmod 700 script.sh

La segunda forma de utilizar el servicio cron es a través de la manipulación de /etc/crontab.

Aquí podemos ver el por qué las carpetas ejecutan los scripts que se encuentran en su interior:

  • La carpeta cron.hourly dice que se ejecutará a cada hora con 17 minutos.
  • La carpeta cron.daily dice que se ejecutará todos los días a la hora 6 con 25 minutos.
  • La carpeta cron.weekly dice que se ejecutará todas las semanas el día domingo a la hora 6 con 47 minutos.
  • La carpeta cron.monthly dice que se ejecutará todos los días 1 del mes a la hora 6 con 52 minutos.

Definición de cada línea de cron

CampoDescripción
MinutoControla el minuto de la hora en que el comando será ejecutado, este valor debe de estar entre 0 y 59.
HoraControla la hora en que el comando será ejecutado, se especifica en un formato de 24 horas, los valores deben estar entre 0 y 23, 0 es medianoche.
Día del MesDía del mes en que se quiere ejecutar el comando. Por ejemplo se indicaría 20, para ejecutar el comando el día 20 del mes.
MesMes en que el comando se ejecutará, puede ser indicado numéricamente (1-12), o por el nombre del mes en inglés, solo las tres primeras letras.
Día de la semanaDía en la semana en que se ejecutará el comando, puede ser numérico (0-7) o por el nombre del día en inglés, solo las tres primeras letras. (sun = domingo)
UsuarioUsuario que ejecuta el comando.
ComandoComando, script o programa que se desea ejecutar. Este campo puede contener múltiples palabras y espacios.

Un asterisco * como valor en los primeros cinco campos, indicará inicio-fin del campo, es decir todo. Un * en el campo de minuto indicará todos los minutos.

Ejemplos de uso de la utilización de cron:

EjemploDescripción
05 * * * *Se ejecuta al minuto 5 de cada hora de todos los días
35 3 * * *A las 3:35 a.m. de cada día
15 20 * * *A las 8:15 p.m. de cada día
00 6 * * 2A las 6 (a.m.) todos los martes
* 5 * * SunCada minuto de 5:00a.m. a 5:59a.m. todos los domingos
45 19 1 * *A las 7:45 p.m. del primero de cada mes
01 * 20 7 *Al minuto 1 de cada hora del 20 de julio
10 1 * 12 1A la 1:10 a.m. todos los lunes de diciembre
00 12 16 * WenAl mediodía de los días 16 de cada mes y que sea Miércoles
30 9 20 7 4A las 9:30 a.m. del dia 20 de julio y que sea jueves
30 9 20 7 *A las 9:30 a.m. del dia 20 de julio sin importar el día de la semana
20 * * * 6Al minuto 20 de cada hora de los sábados
20 * * 1 6Al minuto 20 de cada hora de los sábados de enero

Es posible especificar listas en los campos e incrementos en éstas de la siguiente manera: Valor o lista/incremento.

Tabla de ejemplos de lista/incremento:

EjemploDescripción
59 11 * 1-3 1,2,3,4,5A las 11:59 a.m. de lunes a viernes, de enero a marzo
45 * 10-25 * 6-7Al minuto 45 de todas las horas de los días 10 al 25 de todos los meses y que el día sea sábado o domingo
10,30,50 * * * 1,3,5En el minuto 10, 30 y 50 de todas las horas de los días lunes, miércoles y viernes
*/15 10-14 * * *Cada quince minutos de las 10:00a.m. a las 2:00p.m.
* 12 1-10/2 2,8 *Todos los minutos de las 12 del día, en los días 1,3,5,7 y 9 de febrero y agosto. (El incremento en el tercer campo es de 2 y comienza a partir del 1)
0 */5 1-10,15,20-23 * 3Cada 5 horas de los días 1 al 10, el día 15 y del día 20 al 23 de cada mes y que el día sea miércoles
3/3 2/4 2 2 2Cada 3 minutos empezando por el minuto 3 (3,6,9, etc.) de las horas 2,6,10, etc (cada 4 horas empezando en la hora 2) del día 2 de febrero y que sea martes

Para ingresar scripts a crontab se pueden utilizar 2 vías. Primero directamente con un editar ir a /etc/crontab.

La segunda vía es a través del comando crontab -e, el cual la primera vez que se utiliza pregunta con que editor se desea abrir:

Al seleccionar el número (en mi caso el 2 para usar nano) se verá el archivo crontab.

Ejemplos

Para agregar un cron por consola, utilizaremos el comando “crontab” más la opción –e.

Primero crearemos un script de prueba para ver el funcionamiento de cron.

#!/bin/bash
HORA=$(date +%T)
touch /root/Escritorio/archivo_$HORA

Este script creará en el directorio /root/Escritorio un archivo con el nombre “archivo_(hora-actual)”.

Ahora incluiremos el script en un cron que se ejecute cada 1 minuto. Primero abriremos crontab con la opción –e para editar e incluir nuestra línea que llamará al script al final del archivo (después de los comentarios):

*/1 * * * * /root/script.sh

Para que nuestro script pueda ser ejecutado por cron, debemos darle el permiso de ejecución:

chmod 700 script.sh

Como podemos ver, el script se ejecutó con éxito creando archivos cada 1 minuto:

Existen otras opciones de crontab:

  • crontab -l muestra la lista de los scripts dentro de crontab
  • crontab -r

Como muestra la imagen, se ejecuta el crontab –r para eliminar la lista y luego el crontab –l para verificar que ha sido borrada dicha lista.

En algunas distribuciones cuando se editan crontabs de usuarios normales es necesario reiniciar el servicio para que se puedan releer los archivos de crontab en /var/spool/cron.

Controlando el acceso a cron

Cron permite controlar que usuarios pueden o no pueden usar los servicios de cron. Esto se logra de una manera muy sencilla a través de los siguientes archivos:

  • /etc/cron.allow
  • /etc/cron.deny

Para permitir que un usuario utilice cron, se debe incluir su nombre en el archivo cron.allow y para no permitir su uso, se debe incluir el nombre de usuario en el archivo cron.deny.

La forma más simple de incluir los nombres en estos archivos es de la siguiente manera:

echo usuarioapermitiracceso >> /etc/cron.allow
echo usuarioadenegaracceso >> /etc/cron.deny

También existe la opción de dejar un archivo específico para crontab del usuario con el comando crontab y el archivo de esta forma:

crontab archivo.cron