Product SiteDocumentation Site

9.7. Programación de tareas con cron y atd

cron is the daemon responsible for executing scheduled and recurring commands (every hour, every day, every week, etc.). atd deals with commands to be executed a single time, but at a specific moment in the future.
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:
  • the value for the minute (from 0 to 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).
Cada valor se puede expresar 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 de usuario

#Formato
#min hora dia mes dds    command

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

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

# cada dos horas
 *  */2   *   *   *    $HOME/bin/dosomethingelse

# 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. Toma el tiempo y la fecha deseados como parámetros de línea de comandos, y el comando a ejecutar en su entrada estándar. Ejecutará el programa como si hubiese ingresado en la consola. at incluso se encarga de mantener el entorno para poder reproducir las mismas condiciones al ejecutar el programa. Se indica se configura siguiendo las convenciones normales: 16:12 o 4:12pm representan las 4 y 12 minutosde la tarde. Se 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.22 <<END
> echo "Don't forget to wish a Happy Birthday to Raphaël!" \
>   | mail lolando@debian.org
> END
warning: commands will be executed using /bin/sh
job 1 at Wed Jul 27 09:00:00 2022
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.