Programación de tareas con cron en Ubuntu, Linux Mint y derivados

Para mejorar nuestra productividad, uno de los aspectos a tener en cuenta es evitar en la medida de lo posible la realización de tareas repetitivas. Me refiero a aquellas tareas que tenemos que hacer cada cierto tiempo. Por ejemplo, una vez al día, o cada semana, o cada 15 días o transcurrido un periodo de tiempo determinado. Evidentemente no me refiero a no hacer las tareas, todo lo contrario, me refiero a la programación de tareas.

Los usuarios de Linux contamos con cron. Cron no es otra cosa que una utilidad que ejecuta tareas según la programación de tareas que le hayamos establecido.

En este artículo además de comentar el funcionamiento de cron para la programación de tareas, mostraré algunos ejemplos prácticos y utilidades que seguro les sacas partido.

En su día escribí algún artículo que hacía mención a cron, “como clonar ubuntu desde el terminal” o “como programar la descarga automática de Ubuntu”. Sin embargo, en ambos artículos mencionaba el uso de cron por encima.

Programación de tareas con cron en Ubuntu, Linux Mint y derivados

Programación de tareas con cron

cron se gestiona a través de crontab que es un archivo de configuración donde indicaremos que es lo que se tiene que ejecutar y con que periodicidad.

Llegados a este punto, hay que tener en cuenta, que pueden haber tablas, crontab para cada uno de los usuarios del equipo, y por lo tanto también crontab para el administrador.

Para ver el contenido de nuestra programación de tareas ejecutaremos la orden,

crontab -l

si lo que queremos ver son las de administrador, ejecutaremos

sudo crontab -l

Mientras que para editar nuestra tabla de programación de tareas ejecutaremos la orden,

crontab -e

Como ayuda, he añadido a mi crontab lo siguiente,

##########################################################
#minuto (0-59),                                          #
#|  hora (0-23),                                         #
#|  |  día del mes (1-31),                               #
#|  |  |  mes (1-12),                                    #
#|  |  |  |  día de la semana (0-6 donde 0=Domingo)      #
#|  |  |  |  |       comandos                            #
##########################################################

De esta manera tenemos una idea clara de donde tiene que ir cada cosa…

Por otro lado, si queremos hacer una copia de seguridad de nuestra tabla de programación, solo tenemos que ejecutar la siguiente orden,

crontab -l > copia-de-seguridad.txt

Mientras que para eliminar nuestra tabla de programación, solo tendremos que ejecutar la orden,

crontab -r

Por ejemplo, si queremos realizar una captura de pantalla todos los días a las 13:00, añadiremos la siguiente orden a nuestro crontab,

0 13 * * * scrot -b -d 1 '%Y:%m:%d:%H:%M:%S.png' -e 'mv $f ~/Escritorio/'

Una utilidad interesante es sincronizar nuestro directorio local con un directorio remoto a una hora determinada. Por ejemplo, todos los días a las 12:00

0 12 * * * rsync -avz /home/lorenzo/datos/ 192.168.1.50:/home/lorenzo/datos

También podemos indicar mas de una hora, por ejemplo

0 6,12,18 * * * rsync -avz /home/lorenzo/datos/ 192.168.1.50:/home/lorenzo/datos

Nos haría la sincronización a las seis de la mañana, a las 12 y a las seis de la tardes.

Otra opción interesante es indicar un intervalo, por ejemplo, si queremos que la sincronización solo se realice de lunes a viernes le diríamos,

0 6,12,18 * * 1-5 rsync -avz /home/lorenzo/datos/ 192.168.1.50:/home/lorenzo/datos

De esta manera la sincronización sería de lunes (1) a viernes (5), a las 6, a las 12 y a las 18 horas. Indicar que el domingo es el 0.

Ahora, ¿y si queremos realizar la programación de tareas en lugar de a una hora determinada cada 15 minutos por ejemplo? Vamos a guardar la temperatura de nuestra CPU en un archivo para consultarlo posteriormente,

* */15 * * *  cat /sys/class/thermal/thermal_zone0/temp >> /home/lorenzo/temperaturas.log

A parte de la programación de tareas que hemos visto, también, existen algunas definiciones establecidas. Que son las siguientes,

  • @yearly, equivale a 0 0 1 1 * esto es que la tarea se ejecutará una vez al año. En concreto el 1 de enero a las 0:00 (medianoche).
  • @monthly, equivale a 0 0 1 * *. La tarea se ejecutará una vez al mes. En particular se ejecutará el primer día del mes a las 0:00 (medianoche).
  • @weekly, equivale a 0 0 * * 0. La tarea se ejecutará una vez a la semana. En particular se ejecutará el domingo a las 0:00 (medianoche).
  • @daily, equivale a 0 0 * * *. La tarea se ejecutará una vez al día. Exactamente a las 0:00 (medianoche).
  • @hourly, equivale a 0 * * * *. La tarea se ejecutará al comienzo de cada hora.
  • @reboot, se ejecuta en el arranque. Esta es quizá la mas interesante de las definiciones establecidas, puesto que no se puede realizar de otra manera, y nos permite ejecutar acciones cuando arranca la máquina.

Quedaría pendiente la opción de la programación de tareas al apagar el equipo. Creo que esta opción es realmente muy interesante y le será de gran ayuda a mas de uno, así que la trataré en un próximo artículo.

Algunos ejemplos de programación de tareas

A continuación verás algunos ejemplos de programación de tareas para que te hagas una idea de las opciones y posibilidades que este sistema te ofrece,

1.- Programación de una copia de seguridad todos los años el 10 de junio a las 8:30

    30 08 10 06 * /home/lorenzo/copia-de-seguridad.sh

2.- Realizar la copia de seguridad a las 10:00 y a las 20:00 todos los días de la semana

    00 10,20 * * * /home/lorenzo/copia-de-seguridad.sh

3.- La copia de seguridad la haremos cada hora entre las 8:00 y las 18:00 pero solo los días laborables (de lunes a viernes)

    00 08-18 * * 1-5 /home/lorenzo/copia-de-seguridad.sh

4.- En este caso la copia de seguridad la realizaremos cada 15 minutos entre las 8:00 y las 18:00 y de lunes a viernes

    */15 08-18 * * 1-5 /home/lorenzo/copia-de-seguridad.sh

5.- Ejecutar una tarea el primer domingo de cada mes. Esto es algo mas complicado porque no se puede indicar claramente vía cron. Sin embargo se puede poner un condicional,

0 8 * * 0 [ $(date +%d) -le 07 ] && /home/lorenzo/copia-de-seguridad.sh

6.- Ejecutar una tarea cada 30 segundos. Esto tampoco se puede definir mediante la programación de tareas de cron, pero hay una solución,

* * * * * /home/lorenzo/copia-de-seguridad.sh
* * * * * sleep 30; /home/lorenzo/copia-de-seguridad.sh

7.- Ejecutar varias tareas en un momento determinado. Esto ya lo hemos adelantado en el punto anterior, y es que para ejecutar varias tareas solo tenemos que separarlas mediante punto y coma

*/15 * * * * script1.sh; script2.sh; script3.sh

Más información,

  • Pseudoabulafia Forero

    Gracias por el tutorial.
    Hace tiempo venía pensando (como simple idea) en ver si habría alguna forma rudimentaria de programar un script para que me cambie cada día el icono de la aplicación de calendario que tengo (Orage). Me doy cuenta de que lo mejor es hacer un script que cambe de icono y luego programar para ejecutar el script desde crontab.

    De hecho, buscando un poco más me doy cuenta que en Numix ya habían pensado en eso y lo han llevado a cabo. 😀
    https://github.com/numixproject/numix-calendar-icons

    • Me gusta la idea y la voy a poner en marcha, es una solución muy interesante.
      Gracias.

  • angel30co

    Gracias por este tutorial.