Saltar la navegación

anacron

El uso de cron es muy interesante en la administración de sistemas con servidores 24x7, es decir, equipos que estén funcionando 24 horas los 7 días de la semana. Pero hay una solución aproximada para los equipos de escritorio 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)
# systemctl status anacron.service
# /etc/init.d/anacron status

El servicio anacron puede ser usado (solo 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 manualmente o cuando lo activa cron), 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, tienen una sintaxis distinta, y 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 reales del mes.
  • 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. Estos fichero guardan la fecha de ejecución del comando.
  • 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 que correspondan, 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-23 * * *   root    [ -x /etc/init.d/anacron ] && if [ ! -d /run/systemd/system ]; then /usr/sbin/invoke-rc.d anacron start >/dev/null; fi

Como vemos, y esto es particular de Debian, cron lanza a anacron cada hora desde la 7:30 a las 23:30.

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 solo testear si el fichero está escrito correctamente. Si -T va solo, 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.

NOTA: En Debian, de forma predeterminada, la activación de anacron no se realizará cuando el sistema esté usando batería y no haya alimentación de CA conectada al ordenador. Su objetivo es reducir el uso de energía y prolongar la vida útil de la batería, pero dicho diseño podría generar resultados no deseados. Los usuarios pueden desactivar esta función y dejar que anacron se ejecute independientemente de la fuente de alimentación. La forma de hacerlo se indica en el archivo /usr/share/doc/anacron/README.Debian. En primer lugar hay que crear el siguiente fichero con el contenido que se muestra:

# cat /etc/systemd/system/anacron.service.d/on-ac.conf
[Unit]
ConditionACPower=

Y a continuación ejecutamos:

# systemctl daemon-reload