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:
rotar los archivos de registro;
actualizar la base de datos del programa locate
;
respaldos;
scripts de mantenimiento (como limpiar los archivos temporales).
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:
programas en el directorio /etc/cron.hourly/
una vez por hora;
programas en el directorio /etc/cron.daily/
una vez por día;
programas en el directorio /etc/cron.weekly/
una vez por semana;
programas en el directorio /etc/cron.monthly/
una vez por mes.
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
#Format
#min hour day mon dow command
# Download data every night at 7:25 pm
25 19 * * * $HOME/bin/get.pl
# 8:00 am, on weekdays (Monday through Friday)
00 08 * * 1-5 $HOME/bin/dosomething
# Restart the IRC proxy after each reboot
@reboot /usr/bin/dircproxy
9.7.2. Utilización del programa at
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
también 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.12
representaría el 27 de Julio de 2012), AAAA-MM-DD
(la misma fecha se representaría como 2012-07-27
), MM/DD/[CC]AA
(es decir: 12/25/12
o 12/25/2012
representan, ambas, el 25 de Diciembre de 2012) o simplemente MMDDCCAA
(de forma que 122512
o 12252012
también representaría el 25 de Diciembre de 2012). 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.14 <<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 31 at Fri Jul 27 09:00:00 2012
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.