Programación de Tareas

Debianshell

A veces puede resultar útil poder programar el sistema para que realice tareas a una hora determinada. En esta receta veremos dos maneras de hacerlo.

at

La utilidad at nos permite ejecutar tareas a una determinada hora. Si no la tenéis en el sistema, basta con instalar el paquete at de la manera estándar.

Por ejemplo, vamos a programar que aparezca el eye-of-gnome a las 12:05. Para ello, ejecutamos en un terminal el comando at, indicando a continuación la hora a la que debe comenzar la tarea. Como veréis, aparece un prompt en el que indicaremos las tareas que queremos que se ejecuten, una por línea. Para salir del prompt, hay que pulsar Ctrl+D. Aparecerá un mensaje confirmando la hora y el número de la tarea (job).


$ at 12:05
warning: commands will be executed using /bin/sh
at> eog
at>
job 2 at Fri Oct 17 12:05:00 2008

A menudo, lo que queremos es ejecutar varias tareas, pero en un orden secuencial, no todas a la vez (vamos, lo que viene siendo un script). Suponiendo que queramos ejecutar mistareas.sh, haremos lo siguiente:


$ at -f miscript.sh 13:45
warning: commands will be executed using /bin/sh
job 4 at Fri Oct 17 13:45:00 2008

También se podría poner miscript.sh como una tarea en el modo interactivo del prompt, siempre y cuando tenga los permisos adecuados de ejecución.

Cabe destacar que con at, las tareas quedan programadas para una sola vez, y se borran después de ejecutarse. Es decir, al día siguiente no volverán a ejecutarse.

Si queremos borrar una tarea que tenemos programada, debemos conocer primero su número (el que sale al programarla). Para borrarla, utilizamos atrm. Si no conocemos el número de la tarea o lo hemos olvidado, podemos consultar las tareas programadas con la opción -l:


$ at -l
4 Fri Oct 17 13:45:00 2008 a nacho
$ atrm 4
$ at -l
$

cron

Cron es una herramienta que permite la ejecución de tareas periódicamente en varios intervalos: horario, diario, semanal y mensual. Su utilización es más sencilla que la de at: Basta con guardar el script que queramos ejecutar (éste no tiene modo interactivo) en el directorio correspondiente a cuándo queremos que se ejecute.:

  • Cada hora: /etc/cron.hourly/
  • Cada día: /etc/cron.daily/
  • Cada semana: /etc/cron.weekly/
  • Cada mes: /etc/cron.monthly/

Esta simplificación de uso es específica de Debian (y derivados quizá). Aunque la funcionalidad es posible conseguirla en otras distribuciones, no es tan sencillo (y puede que los directorios mencionados no existan).

Para saber exactamente cuándo se van a ejecutar las tareas, echamos un vistazo al fichero /etc/crontab. Éste es el mío:

# m h dom mon dow user  command
 17 *  *   *   *  root    cd / && run-parts --report /etc/cron.hourly
 25 6  *   *   *  root    test -x /usr/sbin/anacron || ( cd / && run-parts --report /etc/cron.daily )
 47 6  *   *   7  root    test -x /usr/sbin/anacron || ( cd / && run-parts --report /etc/cron.weekly )
 52 6  1   *   *  root    test -x /usr/sbin/anacron || ( cd / && run-parts --report /etc/cron.monthly )

Las columnas indican lo siguiente:

  • m = minute (minuto)
  • h = hour (hora)
  • dom = day of month (día del mes)
  • mon = month (mes)
  • dow = day of week (día de la semana)

Por lo tanto, mi crontab indica que:
- Las tareas "horarias" se ejecutarán en el minuto 17 de cada hora.
- Las tareas diarias se ejecutarán a las 6:25
- Las tareas semanales se ejecutarán el séptimo día de la semana, a las 6:47 (0 y 7 indican Domingo, 1 es Lunes, etc...)
- Las tareas mensuales se ejecutarán el día 1 de cada mes, a las 6:52

Comentarios

Opciones de visualización de comentarios

Seleccione la forma que prefiera para mostrar los comentarios y haga clic en «Guardar las opciones» para activar los cambios.

Muy bueno el explicativo, no

Muy bueno el explicativo, no conocia el AT, pero me viene como anillo al dedo.

Gracias!

----------------------------------
-= FErArg =-
Especialista en Redes

@_ FErArg#FErArg.com
Msn_ FErArg#FErArg.com
Mvl_ (+34)63 56 208 97
Www_ www.FErArg.com
Www_ www.SerInformaticos.es
----------------------------------