Product SiteDocumentation Site

9.7. Programación de tareas con cron y atd

cron es el demonio responsable de ejecutar tareas programadas y recurrentes (todos los días, todas las semanas, etc.); atd está encargado de los programas a ejecutar una sola vez pero en un momento específico en el futuro.
En un sistema Unix, muchas tareas están programadas para ejecutarse regularmente:
De forma predeterminada, todos los usuarios pueden programar tareas para ejecutar. Cada usuario tiene su propio «crontab» en el que pueden almacenarlas. Puede editarlo ejecutando crontab -e (el contenido del mismo es almacenado en el archivo /var/spool/cron/crontabs/usuario).
El usuario root tiene su propio «crontab», pero también puede utilizar el archivo /etc/crontab o escribir archivos «crontab» adicionales en el directorio /etc/cron.d. Estas dos últimas soluciones tienen la ventaja de poder especificar el usuario bajo el que se ejecutará el programa.
De forma predeterminada, el paquete cron incluye algunas tareas programadas que ejecutan:
Muchos paquetes Debian dependen de este servicio: agregan sus scripts de mantenimiento en estos directorios, los cuales garantizan un funcionamiento óptimo de sus servicios.

9.7.1. Formato de un archivo crontab

Cada línea significativa de un archivo crontab describe una tarea programada con los siguientes seis (o siete) campos:
  • el valor del minuto (número de 0 a 59);
  • el valor de la hora (de 0 a 23);
  • el valor del día del mes (de 1 a 31);
  • el valor del mes (de 1 a 12);
  • el valor de los días de la semana (de 0 a 7, donde 1 es el lunes y el domingo es tanto el 0 como el 7; también es posible utilizar las tres primeras letras del nombre del día en inglés, como Sun, Mon, etc.);
  • el nombre de usuario bajo el que se ejecutará el programa (en el archivo /etc/crontab y en los fragmentos ubicados en /etc/cron.d/, pero no en los archivos de cada usuario);
  • el programa a ejecutar (cuando se cumpla la condición definida por los primeros cinco campos).
Todos estos detalles están documentados en la página de manual crontab(5).
Puede expresar cada valor como una lista de valores posibles (separados por coma). La sintaxis a-b describe el intervalo de todos los valores entre a y b. La sintaxis a-b/c describe el intervalo con un incremento de c (por ejemplo: 0-10/2 es lo mismo que 0,2,4,6,8,10. Un asterisco «*» es un comodín y representa todos los valores posibles.

Ejemplo 9.2. Ejemplo de archivo crontab

#Formato
#min hora dia mes dds  programa

# Descargar los datos todas las noches a las 19:25
 25  19   *   *   *    $HOME/bin/descargar.pl

# 08:00 en días de semana (Lunes a Viernes)
 00  08   *   *   1-5  $HOME/bin/haceralgo

# Reiniciar el proxy IRC luego de cada reinicio
@reboot /usr/bin/dircproxy

9.7.2. Utilización del programa at

La orden at ejecuta un programa en un momento específico en el futuro. Obtiene la fecha y hora deseada como parámetros y el programa a ejecutar en su entrada estándar. Ejecutará el programa como si hubiese sido ingresado en la consola actual. at incluso se encarga de mantener el entorno para poder reproducir las mismas condiciones al ejecutar el programa. Puede indicar la hora con las convenciones usuales: 16:12 o 4:12pm representan 12 minutos pasadas las 4 de la tarde. También puede especificar la fecha en varios formatos europeos u occidentales, incluyendo DD.MM.AA (27.07.15 representaría el 27 de Julio de 2015), AAAA-MM-DD (la misma fecha se representaría como 2015-07-27), MM/DD/[CC]AA (es decir: 12/25/15 o 12/25/2015 representan, ambas, el 25 de Diciembre de 2015) o simplemente MMDDCCAA (de forma que 122515 o 12252015 también representaría el 25 de Diciembre de 2015). Sin fecha, ejecutará el programa tan pronto como el reloj indique la hora especificada (el mismo día o el siguiente si ya pasó dicha hora ese día). También puede ingresar simplemente «today» o «tomorrow» representando el día actual o el día siguiente, respectivamente.
$ at 09:00 27.07.15 <<END
> echo "¡No olvides desearle un feliz cumpleaños a Raphaël!" \
>   | mail lolando@debian.org
> END
warning: commands will be executed using /bin/sh
job 31 at Mon Jul 27 09:00:00 2015
Una sintaxis alternativa posterga la ejecución por un tiempo determinado: at now + número período. El período puede ser minutes (minutos), hours (horas), days (días) o weeks (semanas). número simplemente indica la cantidad de dichas unidades deben pasar antes de ejecutar el programa.
Para cancelar una tarea programada con cron, simplemente ejecute crontab -e y elimine la línea correspondiente del archivo crontab. Para tareas en at es casi igual de sencillo: ejecute atrm número-tarea. El número de tarea es indicado por at cuando la programó, pero puede volver a encontrarla ejecutando atq que le proveerá una lista de las tareas programadas actualmente.