Automatizar tareas con cron y anacron

Índice

1. Introducción
2. CRON
2.1 Configuración
2.2 Explicación de /etc/crontab y ejemplos
3. ANACRON


1. Introducción

Cron permite automatizar tareas para que así puedas olvidarte de ellas. Por ejemplo, puede utilizarlo para hacer un backup de archivos importantes, o un backup de algún log, etc. Sin embargo, si apagamos el ordenador y al encenderlo ya se ha pasado el instante en el que queríamos ejecutar una tarea, ya no se ejecutará. Por eso, para ordenadores que no están siempre encendidos, es más útil Anacron.

2. CRON

2.1 Configuración

El archivo de configuración de cron está en /etc/crontab y tiene el siguiente contenido:

# /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 )
#

Estas tareas por defecto quieren decir que si situamos un script con permisos de ejecución en /etc/cron.hourly, /etc/cron.daily, /etc/cron.weekly y /etc/cron.monthly se ejecutará cada hora, cada día, cada semana y cada mes respectivamente.

Así, si queremos que un determinado script se ejecute cada hora, tendríamos que darle permisos de ejecución y guardarlo en la carpeta /etc/cron.hourly

Cada usuario puede tener su propia lista de tareas automatizadas. El superusuario es el único que puede ver y editar las de todos los usuarios.

Para automatizar una tarea, podemos incluirla en el archivo /etc/crontab indicando el usuario al que pertenece dicha tarea, o podemos usar crontabs separados para cada usuario. Los crontabs de cada usuario se almacenan en /var/spool/cron/crontabs

Cada minuto cron, comprobará si tiene alguna tarea que realizar.

2.2 Explicación de /etc/crontab y ejemplos

¿Qué significa cada campo del fichero /etc/crontab?

  1. El primer campo son los minutos (0-59)
  2. El segundo las horas (0-23)
  3. El tercero el día del mes (1-31)
  4. El cuarto es el mes (1-12)
  5. El quinto es el día de la semana (0-7, siendo el Domingo tanto el 0 como el 7)
  6. El sexto es el usuario al que pertenece la tarea
  7. El último es el comando a ejecutar

Vemos algunos ejemplos para automatizar la ejecución de una tarea:

  • Todos los días a las 6 en punto de la tarde:
  • 0  18  *  *  *  usuario    comando
  • Todos los jueves a las 2:30 de la mañana:
  • 30  2  *  *  4  usuario    comando
  • Cada 15 minutos de 7 a 9 de la tarde:
  • */15  19-21  *  *  * usuario    comando
  • Cada 5 minutos durante la primera media hora de cada Sábado:
  • 0-30/5  0  *  *  5 usuario    comando
  • El día 15 y 21 de cada mes a las 4 de la mañana:
  • 0  4  15,21  *  * usuario    comando
  • El 25 de Septiembre a las 10 de la noche y sólo si es martes:
  • 0  22  25  9  2  usuario    comando

Los astericos significan "todos" (por ejemplo, un asterisco en el campo mes significa todos los meses).

Si quieres ejecutar más de un comando en un mismo instante, puedes separar los comandos por un ";". Ejemplo:

0  22  25  9  2  usuario    mv procesos procesos.backup; ps -ef > procesos

Para editar el crontab con el editor por defecto, puedes hacer:

crontab -e

Si eres el superusuario y quieres editar el archivo de un usuario en concreto, puedes hacer:

crontab -u nombreusuario -e

Para ver el contenido del crontab de un usuario:

crontab -u nombreusuario -l

Para borrar el crontab:

crontab -r

3. ANACRON

El fichero de configuración de anacron es /etc/anacrontab. En ese archivo puedes especificar tareas que quieres que se ejecuten cada día, cada semana o cada mes, pero no se puede especificar el instante exacto.

## /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

# These replace cron's entries
1 5 cron.daily nice run-parts --report /etc/cron.daily
7 10 cron.weekly nice run-parts --report /etc/cron.weekly
@monthly 15 cron.monthly nice run-parts --report /etc/cron.monthly

En este archivo sólo hay 4 campos. Con el primero se indica cada cuantos días se quiere realizar la tarea. Con el segundo puedes determinar el número de minutos que transcurrirán desde que ejecutas anacron hasta que se lanza la tarea programada. El tercer campo es el nombre de la tarea, y el cuarto, el comando.

Anacron busca en /var/spool/anacron el fichero creado para cada tarea en su última ejecución. Si se observa que la última ejecución de una tarea que debe ser lanzada semanalmente, lleva 8 días (por ejemplo) sin ejecutarse, entonces lanzará dicha tarea.

Con

anacron -f

fuerzas la ejecución de las tareas sin tener en cuenta la última vez que se ejecutaron y cuando deberían volver a ejecutarse.

Con

anacron -n

se ejecuta anacron de forma inmediata, sin respetar el tiempo de espera o de retardo indicado en /etc/anacrontab

Puedes almacenar scripts en los directorios /etc/cron.* y programar su ejecución con cron. Si cuando llegue el momento de la ejecución, tu ordenador está apagado, no importa, ya que con anacron pondrás al día la ejecución de todos ellos.

Para más información:

man cron
man crontab
man anacron
man anacrontab