Saltar la navegación

anacron

El uso de cron es muy interesante en la administración de sistemas, pero siempre en equipos de alta disponibilidad, es decir, equipos que estén funcionando 24 horas 7 días a la semana. Pero hay una solución aproximada para los equipos normales que pasan periodos de tiempo apagados y se llama anacron (no es un intento de sustituir a cron, es una herramienta complementaria).

Podemos ver el estado del servicio anacron así:

# service anacron status
● anacron.service - Run anacron jobs
   Loaded: loaded (/lib/systemd/system/anacron.service; enabled)
   Active: inactive (dead) since lun 2015-12-07 17:52:46 CET; 6min ago
  Process: 2179 ExecStart=/usr/sbin/anacron -dsq (code=exited, status=0/SUCCESS)
 Main PID: 2179 (code=exited, status=0/SUCCESS)

dic 07 17:52:46 servidorbackup anacron[2179]: Anacron 2.3 started on 2015-12-07
dic 07 17:52:46 servidorbackup anacron[2179]: Normal exit (0 jobs run)

El servicio anacron puede ser usado (sólo por el root, no puede ser usado por los usuarios) para ejecutar comandos periódicamente, con una frecuencia de días. Cuando anacron se ejecuta (al iniciarse el sistema o bien manualmente), lee las tareas programadas únicamente del fichero /etc/anacrontab. Este fichero es parecido a un fichero crontab, en su interior puede haber igualmente comentarios y variables (PATH, SHELL, MAILTO, HOME, etc.), pero las líneas que especifican la tarea y el momento de ejecución, varían en su sintaxis; los campos son los siguientes:

días   minutos_de_retraso   identificador   comando_a_ejecutar
  • días: Indica cuantos días tienen que pasar como mínimo desde la última ejecución del comando para volverlo a lanzar. Para tareas mensuales es conveniente escribir @monthly en vez de un número de días, esto garantiza que se ejecutará la tarea una vez al mes sin importar el número de días de los distintos meses.
  • minutos_de_retraso: Es la cantidad de minutos que se esperará para lanzar el comando después de que haya llegado el momento de ejecutarlo. De este modo se pueden espaciar las diferentes órdenes a ejecutar y evitar una sobrecarga en el sistema si este lleva mucho tiempo sin funcionar, pues si no, todo se tendría que ejecutar a la vez.
  • identificador: Indica un nombre que identifica al comando y será utilizado como nombre de fichero dentro de /var/spool/anacron.
  • comando_a_ejecutar: La orden en sí.

Cuando los comandos terminan de ejecutarse, anacron registra la fecha de finalización en un fichero dentro del directorio /var/spool/anacron para chequear el momento de la próxima ejecución. Estos ficheros tienen por nombre el identificador del comando.

El contenido por defecto de /etc/anacrontab es el siguiente:

# /etc/anacrontab: configuration file for anacron

# See anacron(8) and anacrontab(5) for details.

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

Como vemos, ejecuta los scripts de los directorios /etc/cron.daily, /etc/cron.weekly y /etc/cron.monthly. que también utiliza cron, por lo que los script podrían ejecutarse dos veces. Esto se evita porque en el fichero /etc/crontab se comprueba con la orden test si anacron está instalado y si es así, no se ejecutarán los scripts de los tres periodos.

$ cat /etc/crontab 
# /etc/crontab: system-wide crontab
# Unlike any other crontab you don't have to run the `crontab'
# command to install the new version when you edit this file
# and files in /etc/cron.d. These files also have username fields,
# that none of the other crontabs do.

SHELL=/bin/sh
PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin

# m h dom mon dow user    command
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 )

Después de arrancar el sistema y anacron haber comprobado y lanzado las tareas programadas, este se para, por lo tanto, ¿cómo es posible que una tarea la vuelva a ejecutar anacron si un ordenador se lleva más de un día encendido?. La respuesta está en que existe un fichero crontab que lanza el servicio anacron, este fichero es /etc/cron.d/anacron:

$ cat /etc/cron.d/anacron 
# /etc/cron.d/anacron: crontab entries for the anacron package

SHELL=/bin/sh
PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin

30 7    * * *   root    test -x /etc/init.d/anacron && /usr/sbin/invoke-rc.d anacron start >/dev/null

En el fichero /etc/anacrontab sí se pueden dividir las líneas largas en varias líneas, finalizándolas con el carácter '\'. 

El servicio anacron se puede lanzar manualmente con el comando anacron, al cual se le puede añadir opciones:

  • Para forzar inmediatamente la ejecución de las tareas sin tener en cuenta la fecha de la última vez en la que se ejecutaron:
# anacron -f
  • Para ejecutar las tareas inmediatamente, sin esperar a que transcurra el tiempo de retraso indicado en /etc/anacrontab:
# anacron -n
  • Para usar un fichero distinto a /etc/anacrontab:
# anacron -t fichero

Se puede añadir la opción -T para sólo testear si el fichero está escrito correctamente. Si -T va sólo, se testea /etc/anacrontab.

  • Para actualizar la fecha de los ficheros de control de anacron sin ejecutar las tareas:
# anacron -u

Si con anacron quisiéramos ejecutar un comando como otro usuario, y no como root, se debería usar su con el comando a ejecutar.

Licencia: licencia de software libre GPL