Saltar la navegación

Ficheros crontab

Un fichero crontab es donde se especifican las tareas programadas indicando el comando a ejecutar y el momento de su ejecución. Hemos visto que, a priori, en Debian todos los usuarios pueden ejecutar cron, para lo cual, cada uno tendrá un fichero crontab con su nombre en la carpeta /var/spool/cron/crontabs:

# ls -l /var/spool/cron/crontabs
total 4
-rw------- 1 usuario crontab 1130 dic  5 20:04 usuario

En estos ficheros, una línea que expresa una tarea programada tiene la siguiente sintaxis:

minutos   horas   días_del_mes   meses   días_de_la_semana   comando_a_ejecutar

Los valores posibles para cada una de las columnas son:

  • Minutos: de 0 a 59.
  • Horas: de 0 a 23.
  • Días del mes: de 1 a 31.
  • Meses: de 1 a 12.
  • Días de la semana: de 0 a 7, siendo el 0 y el 7 domingo.
  • Orden a ejecutar: se recomienda usar rutas absolutas.

Los cinco primeros campos pueden escribirse de diversas formas:

  • Un solo número indica ese valor concreto de minuto, hora, día del mes, etc., según el campo.
  • Un asterisco (*) se referiría a todos los valores del campo.
  • Una lista de valores individuales separados por comas, por ejemplo: 2,7,8,24,17.
  • Un rango de números (a-b), por ejemplo, 30-35 sería equivalente a la lista 30,31,32,33,34,35.
  • Un rango de números con paso (a-b/c), por ejemplo, 30-35/2 para la lista 30,32,34. Es válido también */c, por ejemplo, */2, todos los valores de dos en dos empezando por el primero.
  • Una lista de números individuales y/o rangos separados por comas, por ejemplo, 3,5,10-15,20,30-38/2.
  • Para los meses y los días de la semana se aceptan también sus nombres en inglés o sus tres primeras letras, pero no pueden usarse los nombres para crear un rango.

En cuanto a la orden a ejecutar, se mandará a ejecución el resto de la línea o hasta el primer signo %, toda la información que haya a partir del signo % se mandará al comando por la entrada estándar, habiendo sustituido antes los signos % por el carácter nueva línea (\n). Si el comando fuera muy largo, no se puede dividir la línea tal y como se hace en el shell con el carácter '\', tiene que estar todo en la misma línea.

Los cinco primeros campos juntos pueden sustituirse por alguna de las siguientes palabras:

@reboot    
Se ejecutará una vez al arrancar el sistema.
@yearly Se ejecutará una vez al año. ("0 0 1 1 *")
@annually Se ejecutará una vez al año. ("0 0 1 1 *")
@monthly Se ejecutará una vez al mes. ("0 0 1 * *")
@weekly Se ejecutará una vez a la semana. ("0 0 * * 0")     
@daily Se ejecutará una vez al día. ("0 0 * * *")
@midnight    
Se ejecutará una vez al día. ("0 0 * * *")
@hourly Se ejecutará una vez a la hora. ("0 * * * *")

Hay que tener en cuenta que todos los campos efectúan una conjunción (y) de sus condiciones. Pero existe una excepción, cuando los campos días del mes y días de la semana tiene un valor distinto de asterisco, en ese caso, ambos hacen una disyunción (o).

Algunos ejemplos:

1 * * * *    
Se ejecuta en el minuto 1 de cada hora de todos los días.
25 9 * * * A las 9:25am de todos los días.
25 21 * * * A las 9:25pm de todos los días.
0 7 * * 0 A las 7:00am de todos los domingos.
* 7 * * Sun A cada minuto de las 7:00am a las 7:59am de todos los domingos.
45 18 1 * * A las 6:45pm del primero día de cada mes.
1 * 21 3 * Al minuto 1 de cada hora del 21 de marzo.
10 2 * 11 1 A las 2:10am de todos los lunes de noviembre.
30 7 21 3 2 A las 7:30am del día 21 de marzo o los martes de marzo.
30 7 21 3 * A las 7:30am del día 21 de marzo.
15 * * * 6 En el minuto 15 de cada sábado.
59 23 * 1,3 1-5 A las 11:59am de lunes a viernes en los meses de enero y marzo.
55 * 10-28 * 6 En el minuto 55 de cualquier horas entre los días 10 y 28 o los sábados.
10,30,50 * * * 1,3,5 En los minutos 10, 30 y 50 de cualquier hora de los lunes, miércoles y viernes.
*/10 10-16 * * * Cada diez minutos desde las 10:00am hasta las 4:00pm.
* 12 1-10/2 2,8 * A cada minuto de las 12am durante los días 1,3,5,7 y 9 de febrero y agosto.
0 */6 1-10,15,20-25 * 2 Cada 6 horas, al comienzo de cada una de ellas, de los días 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 15, 20, 21, 22, 23, 24 y 25 de cada mes o los martes.  
5-59/5 1-23/5 5 5 5 Cada 5 minutos empezando por el minuto 5 de las horas 1, 6, 11, etc. del día 5 de mayo o los viernes.

Además de los ficheros crontab de cada usuario, están los del sistema, es decir, los ficheros crontab que el root prepara para organizar las tareas programadas del sistema. De estos, el fichero fundamental es /etc/crontab, el cual, como ya vimos, viene preparado para ejecutar los scripts que el root o las aplicaciones que se instalan, pongan en cuatro carpetas (cron.hourly, cron.daily, cron.weekly y cron.monthly). Por otro lado, y aunque Debian aconseja solo el uso de este fichero, el root también puede poner ficheros crontab en la carpeta /etc/cron.d.

Tanto el fichero /etc/crontab, como los que se pongan en /etc/cron.d, tienen la misma sintaxis y uso que los ficheros crontab que hemos visto de los usuarios, pero con una la salvedad, y es que delante del comando, se debe poner el usuario que lo ejecutará, habitualmente el root.

minutos   horas   días_del_mes   meses   días_de_la_semana   usuario   comando_a_ejecutar

Un ejemplo lo podemos ver en el fichero /etc/crontab que se instala por defecto:

17 *    * * *    root    cd / && run-parts --report /etc/cron.hourly
25 6    * * *    root    test -x /usr/sbin/anacron || ( cd / && run-parts --report /etc/cron.daily )
47 6    * * 7    root    test -x /usr/sbin/anacron || ( cd / && run-parts --report /etc/cron.weekly )
52 6    1 * *    root    test -x /usr/sbin/anacron || ( cd / && run-parts --report /etc/cron.monthly )

Es posible también usar variables en los ficheros crontab, y como estos se leen de arriba a abajo, las variables solo afectan a las tareas que están escritas después del punto donde se les asigna el valor.

La forma de asignar una variable es la siguiente:

variable  =  valor

Los espacios que rodean al signo = son opcionales, y si el valor lleva espacios al principio y/o al final y queremos preservarlos, debemos meterlo entre comillas simples o dobles. La cadena vacía obligatoriamente deberá ir entre comillas.

El valor de una variable puede expandirse como en el shell, usando el signo $, pero esta expansión no puede utilizarse en una asignación de variables. Por ejemplo, sería incorrecto:

PATH = $HOME/bin:$PATH

y correcto:

5 0 * * *       $HOME/bin/daily.job >> $HOME/tmp/out 2>&1

Existen algunas variables que crea el propio cron y les da un valor por defecto:

  • SHELL= /bin/sh
  • LOGNAME = usuario dueño del fichero crontab
  • HOME = directorio casa del usuario LOGNAME
  • PATH = /usr/bin:/bin

La variables anteriores pueden ser reescritas, con la excepción de LOGNAME.

La variable SHELL indica el shell que ejecutará la tarea y tendremos que modificarla para que se use el shell /bin/bash.

La variable HOME indica el directorio desde donde se ejecutará la tarea y por lo tanto es la referencia para las rutas relativas.

La variable PATH se usará para indicar los directorios donde se buscará el comando, pero se aconseja escribir los comandos con su ruta absoluta.

Existe la variable MAILTO para que pongamos la dirección de correo electrónico donde queremos que cron notifique las situaciones especiales. Para que no haya ningún tipo de notificación habrá que asignarle la cadena vacía. Si no se le hubiera asignado ningún valor, las notificaciones se enviarán al usuario que sea dueño del fichero crontab.

Por último, también se pueden poner comentarios en los ficheros crontab, pero solo como líneas completas, comenzando estas por el signo #. No se pueden poner comentarios al final de una línea.