Programación de tareas asíncronas en Linux con Anacron
Anacron es un servicio que se ejecuta cada vez que se inicia un sistema Linux y que complementa a cron. Su objetivo es comprobar si alguna tarea programada por el cron no ha sido realizada debido a que el sistema no estuviera encendido. Por ejemplo, si tenemos programado un backup con el cron de Linux a las 3 de la madrugada pero por lo que sea nuestro equipo estaba apagado en ese momento, anacron lo detectará y realizará las operaciones pertinentes.
Dado que Anacron se ejecuta al iniciar la máquina, es posible que perdamos algo (no mucho) de rendimiento, ya que al fin y al cabo es un programa que se inicia como otros, aunque no lo veamos. Al ejecutarse, lo hace siguiendo la configuración del archivo localizado en /etc/anacrontab. El contenido de mi archivo (en Ubuntu 14.04) es el siguiente:
SHELL=/bin/sh PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin HOME=/root LOGNAME=root # These replace cron's entries 1 5 cron.daily run-parts --report /etc/cron.daily 7 10 cron.weekly run-parts --report /etc/cron.weekly @monthly 15 cron.monthly run-parts --report /etc/cron.monthly
La explicación no es muy complicada: al principio se declaran 4 variables de entorno y luego tenemos las 3 últimas líneas, que describen el horario y los scripts que deben ser ejecutados. La primera columna representa el período en días, semanas o meses (@daily, @weekly o @yearly) que utiliza anacron para comprobar si una determinada tarea ha sido ejecutada en ese día, semana o mes. La segunda columna expresa los minutos que debe esperar anacron para ejecutar la tarea al encender el equipo, en caso de que haya que ejecutarla. En este caso, para tareas diarias esperaría 5 minutos, para semanales 10 y para las mensuales 15. En la tercera columna muestra el identificador de la tarea: diaria, semanal o mensual. Finalmente tenemos una cuarta columna que muestra el comando a ejecutar en caso de que sea necesario. Este comando ejecuta los archivos que estén dentro de las carpetas /etc/cron.daily, weekly y monthly.
Para cada tarea, anacron comprueba si ha sido realizada previamente en el periodo específico. En caso de haber sido ejecutada, no se hace nada. Si por lo contrario, no ha sido ejecutada, anacron espera un tiempo establecido en la segunda columna para ejecutar el comando de la cuarta.