Alejandrox

Blog personal de Alejandro Meroño Hernández

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:

Popularity: 4% [?]


Otras entradas que te pueden interesar



Esta entrada tiene

un comentario

Escrito por Alejandrox

Abril 11th, 2007 at 8:40 pm

Categoría: Ubuntu

Un comentario en 'Programando tareas en Linux con cron y at'

Suscríbete a comentarios con RSS o TrackBack en 'Programando tareas en Linux con cron y at'.

  1. 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

Deja un comentario