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: 4% [?]
Otras entradas que te pueden interesar
- Comparativa de sistemas operativos. Vista vs Ubuntu
- Gnome-schedule. Crear tareas programadas en Ubuntu
- Soporte mp3 para k3b
- Google Sky en Ubuntu
- Mostrar archivos ocultos en Ubuntu (Gnome)
- Crea una nube de etiquetas en tu blog con ZoomClouds
- Cambiar la contraseña de root en Mysql (Ubuntu)





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