Programando tareas en Linux con cron y at
Cron es un servicio de Linux que permite planificar tareas o procesos para una ejecución periódica. Con cron podremos planificar tareas como por ejemplo, borrar ficheros temporales todas las noches, apagar la máquina a una hora determinada, realizar copias de seguridad cada semana automáticamente, etc.La forma normal de programar una tarea es con el comando crontab. La sintaxis de este comando es la siguiente:
- crontab -l: muestra las entradas programadas por el usuario.
- crontab -e: edita el fichero de configuración del usuario.
- crontab -r: elimina el fichero crontab del usuario.
- crontab -u usuario: aplica una de las opciones anteriores para un usuario determinado.
- crontab fich: instala el fichero fich como crontab del usuario.
Cada usuario tiene un fichero de configuración crontab que se encuentra en el directorio /var/spool/cron/crontabs. Este fichero tiene una sintaxis específica y en él escribiremos una línea para cada acción que queramos programar. Cada línea tiene un formato con los siguientes campos:
minutos horas día-mes mes día-semana comando
El valor que puede tomar cada uno de los campos es el siguiente:
- minutos: 0-59
- horas: 0-23
- día-mes: 1-31
- mes: 1-12
- día-semana: 0-7 (el domingo se puede indicar con 0 o con 7)
Veamos a continuación algún ejemplo. Supongamos que el usuario alex quiere realizar una copia de los documentos que tiene en el directorio /home/alex/documents/. El contenido de todo ese directorio lo quiere copiar al directorio /home/alex/copiaseguridad/ el día 15 de cada mes a las 22:30 horas. ¿Cómo se haría con cron? Pues en primer lugar debería editar su fichero de configuración crontab escribiendo crontab -e en la consola (Aplicaciones/Accesorios/Terminal). Cuando lo haga se abrirá su fichero de configuración con el editor de textos predeterminado. El editor de textos utilizado es el definido en las variables EDITOR o VISUAL. En ese fichero el usuario alex escribirá la siguiente línea:
30 22 15 * * cp -r /home/alex/documents/* /home/alex/copiaseguridad/
El símbolo ‘*’ en este caso indica que la tarea se ejecutará todos los meses caiga en el día de la semana que caiga el día 15. Por eso ponemos ‘*’ en el campo mes y día-semana.Veamos otro ejemplo. El usuario alex quiere programar una tarea para que se apague la máquina todos los días a las 3:00. En este caso la línea en el fichero de configuración crontab quedará de la siguiente manera:
3 0 * * * halt
En el fichero de configuración crontab se puede hacer uso de ciertos caracteres especiales como el asterisco (*), la coma, el guión, o la barra (/). La coma sirve para especificar una lista. En el siguiente ejemplo se realiza una copia del directorio documents los días 15, 16, 17 y 18 de cada mes a las 22:30 horas.
30 22 15,16,17,18 * * cp -r /home/alex/documents/* /home/alex/copiaseguridad/
El guión permite especificar un rango. Otra forma de indicar lo mismo que el ejemplo anterior empleando el guión sería:
30 22 15-18 * * cp -r /home/alex/documents/* /home/alex/copiaseguridad/
El carácter barra (/) permite especificar intervalos en los rangos. Por ejemplo, si hablamos de horas, 8-16/2 significa que el comando se ejecutará a las 8, 10, 12, 14 y 16 horas. Si hablamos de minutos, por ejemplo, */5 significa cada 5 minutos.
Se debe aclarar también que en el fichero de configuración se pueden indicar los días de la semana y meses con abreviaturas en vez de números (sun, mon, jan, feb…)
También se pueden especificar los siguientes ’sinónimos’:
- @reboot: cada vez que el sistema arranque.
- @yearly: equivale a 0 0 1 1 *
- @monthly: equivale a 0 0 1 * *
- @weekly: equivale a 0 0 * * 0
- @daily: equivale a 0 0 * * *
- @hourly: equivale a 0 * * * *
Aparte del archivo crontab de cada usuario, que ya hemos comentado que se encuentra en el directorio /var/spool/cron/crontabs/, hay un crontab general para todos los usuarios que se encuentra en /etc/crontab. Este fichero sólo puede ser modificado por el administrador (root).En este archivo cada línea tiene un campo adicional en el que se especificará el usuario que ejecutará cada tarea:
minutos horas día-mes mes día-semana usuario comando
El comando at
El comando at permite ejecutar tareas a una determinada hora. El formato básico de este comando es: at hora . Si queremos, por ejemplo, apagar la máquina a las 22:30, tendríamos que abrir el terminal y escribir en la línea de comandos: at 22:30. A continuación aparecerá el prompt de at en el que escribiremos el comando a ejecutar, en nuestro caso el comando halt. Cuando lo hayamos hecho pulsaremos la combinación de teclas Control+D para salir de at.
Para mostrar la lista de tareas programadas emplearemos el comando at con el parámetro -l: at -l. Podemos hacer lo mismo con el comando atq. Si lo que queremos es eliminar una tarea emplearemos el comando at con los parámetros -d num_tarea . Cada tarea tiene asociado un número que podemos ver con at -l. También podemos eliminar una tarea con atrm num_tarea.
At permite especificar la hora de diferentes formas:
-
now + intervalo, donde intervalo puede ser minutes, hours, days, weeks o months. Si, por ejemplo, queremos ejecutar una tarea dentro de 3 horas, la manera correcta sería: at now+3 hours.
-
at hora día. Ejemplos: at 5am May 20, at 20:30 May, at 20:30 5/5/2008. El parámetro día es opcional. También podemos usar noon (mediodía), teatime (4pm) o midnight (00:00).
Más información:
- http://www.adslayuda.com/Linux-crontab.html
- http://www.fentlinux.com/web/?q=node/576
- http://www.buanzo.com.ar/lin/cron_y_at.html
- Manual de crontab (man crontab)
Popularity: 3% [?]
Otras entradas que te pueden interesar
- Comparativa de sistemas operativos. Vista vs Ubuntu
- Soporte mp3 para k3b
- Google Sky en Ubuntu
- Mostrar archivos ocultos en Ubuntu (Gnome)
- Gnome-schedule. Crear tareas programadas en Ubuntu
- Crea una nube de etiquetas en tu blog con ZoomClouds
- Extensión de Firefox para guardar una página web como una imagen





Como especificas el tiempo
crontab minutos horas dias mes dia-semana tarea ?
En tu primer ejemplo tienes minutos horas * * ..
En tu segundo ejemplo tienes hoas minutos * * ..
mvb
20 Jun 08 at 3:55 pm
Excelente artículo. Claro, conciso y ordenado. Recién estoy empezando con Linux y me vino al pelo para mi script de cambiar fondos y seguro lo utilizaré mucho más en el futuro.
Mil gracias y saludos.
Daniel
6 Jun 09 at 10:30 am
thank you very much, sintétito (o sea sin tetas) conciso rápido y bien explicado.
dos pulgares arriba papá
martosurf
27 Nov 09 at 7:01 pm
[…] A continuación tendremos que tendremos que utilizar cron para la sincronización se realice automáticamente. Ya hablé de cron en el siguiente artículo, donde hice un breve repaso de la planificación de tareas en Linux: programando tareas en Linux con cron y at […]
Sincroniza carpetas ubicadas en equipos diferentes con rsync | Alejandrox
28 Dic 09 at 5:54 pm