domingo, 15 de marzo de 2009

Cómo programar tareas automáticas usando Crontab o Gnome Schedule

Fuente: Ubuntu Documentation. Man

En caso de querer programar una tarea podemos usar Crontab o, en su defecto, Gnome Schedule, que no es más que una interfaz gráfica de la primera. Para entender cómo funcionan ambas herramientas es necesario tener claro qué es cron y su relación con crontab:

Cron es un demonio, es decir, es un proceso que se ejecuta en segundo plano, sin interactuar con el usuario, que es usado para programar tareas que serán ejecutadas en un tiempo específico. Por otra parte, crontab es un archivo de texto y cada usuario posee el suyo. En este archivo el usuario puede especificar el momento en que se ejecutará una determinada tarea. Es así como en el interior del archivo crontab se encuentra una lista de comandos y sus respectivos tiempos de ejecución. Ambos factores son controlados por el demonio cron y son llevados a cabo en segundo plano por el sistema. De igual manera, el sistema también posee un crontab, en donde se especifica una serie de tareas que son realizadas de forma regular.

Como usuario puedes usar cron de dos maneras: editando el archivo crontab o mediante Gnome Schedule.

Editando el archivo crontab
Primero, para editar crontab, en el terminal escribes:
crontab -e

Se te pedirá que escojas un editor. Yo he escogido nano. La pantalla que verás será parecida a esta:



Como podrás ver se trata de un archivo cuyo contenido se limita a una linea antecedida por el signo #. Ello nos indica que se trata de un comentario y será ignorado por el sistema. Este comentario cumple la función de orientarnos respecto al formato que deben respetar las entradas que agreguemos en el archivo. Como puedes ver, la entrada típica de crontab cumple con el formato:
[m] [h] [dom] [mon] [dow] [command]

Una manera de no olvidar lo que cada parámetro significa es entendiendo su significado:

Parámetro Significado Rango

m minute (minuto) 0-59
h hour (hora) 0-23
dom day of month (día del mes) 1-31
mon month (mes) 1-12
dow day of week (día de la semana) 0-6 (0=Domingo)
command command (comando)

Por lo tanto, en caso de dudas basta con mirar la primera línea de nuestro archivo para saber qué parámetro incluir sin la necesidad de memorizar nada.
Veamos un ejemplo práctico. Supongamos que tienes un script que respalda nuestra colección Amarok. Supongamos que su ruta es /home/usuario/Script/amarok/backup_coleccion_amarok. En caso de que deseemos ejecutarlo el primero de cada mes, a las 4 de la tarde, escribimos la siguiente entrada en nuestro archivo:
* 16 1 * * /home/usuario/Script/amarok/backup_coleccion_amarok

Cuando el parámetro del día de la semana (dow) y el correspondiente al día del mes (dom) son ingresados, basta que uno de los dos se cumpla para que la tarea se ejecute. Por lo tanto, si queremos que el script corra el primero de cada mes, además de todos los lunes, en ambos casos a las 4 de la tarde, escribimos:
* 16 1 * 1 /home/usuario/Script/amarok/backup_coleccion_amarok

Es posible especificar rangos de números para cada parámetros escribiendo dos números separados por un guión. Además puedes ingresar listas de números separándolos por comas. Ambos formatos pueden convivir en un mismo parámetro. Por lo tanto, en caso de que desees que el script se corra el primero de cada mes, a la vez que todos los días 5, 6 y 7 de cada mes, siempre a las 4 de la tarde, la entrada quedaría así:
* 16 1,5-7 * * /home/usuario/Script/amarok/backup_coleccion_amarok

También puedes especificar pasos (steps) con el fin de saltarte determinados números. Cada paso afecta a la unidad de tiempo al que se asocia. Para ello es necesario escribir:
‘‘/número’’

Supongamos que deseas que el script se ejecute cada tres horas el primero de cada mes a partir de las 4 de la tarde:
* ‘‘16-23/3‘‘ 1 * * /home/usuario/Script/amarok/backup_coleccion_amarok

En caso de que desees ver la lista de tareas que hayas programado escribes en el terminal:
crontab -l

Para borrar tu crontab escribes:
crontab -r


Utilizando Gnome Schedule
Es posible instalarl Gnome Schedule con Synaptic o escribiendo en el terminal:
sudo apt-get install gnome-schedule

Una vez instalado puedes correrlo desde Aplicaciones-->Herramientas del sistema-->Tareas programadas. Te aparecerá una ventana parecida a esta:



Si presionas en el botón Nuevo se te preguntará qué tipo de tarea deseas añadir:



Básicamente son tres opciones: tareas que se ejecutan periódicamente, tareas que se ejecutan una sola vez y usar una programación predefinida anteriormente.
Supongamos que quieres ejecutar el script el primero de cada mes, a las 4 de la tarde. Escoges la primera opción. Luego basta hacer click en la opción Advanced y anotar los datos necesarios:



Como podrás ver es posible en este punto guardar la programación de la tarea en caso de que quieras utilizarla posteriormente escogiendo la opción Add as template.
Una vez programada la tarea esta habrá de aparecer en la ventana principal:



Ojo que Gnome-Scheduler no es otra cosa que una interfaz gráfica para editar nuestro archivo crontab. Por lo tanto, si ejecutamos el comando crontab -l podemos ver que la tarea está programada y en caso de necesidad, podemos modificar la entrada editando el archivo de texto.

3 comentarios:

dogeraoni dijo...

muy bien amigo pero yo he tenido problemas por q no se especifica como y donde colocar esto del cron ejemplo: #crontab -e
alli me decian unos
#crontab -u usuario -e
en fin coloque en los 2 lo mismo
#13 17 ** 1-5 usuario /cron.sh
#13 17 ** 1-5 root /cron.sh

hasta a /etc/crontab fui a dar q fue donde vi varias cosas q usaba ya. Bueno pero aun no se me ejecuta el scrip ya le di permisos y si lo puedo ejecutar pero desde consola no automaticamente...
q como se a el script es simplemente mkdir cron
nmap localhost >> /home/user/texto.txt

a tambien lo coloque asi:
#13 17 ** 1-5 root /home/user/cron.sh

el 13 17 es la hora en la q lo estaba probando es decir las 17:13 creo... aunque creo q si se ejecuta por q me mandan mensajes a /var/mail/user
esto es el cuerpo del mensaje

From orfeos@venenux Tue May 19 16:58:21 2009
Return-path:
Envelope-to:
Delivery-date: Tue, 19 May 2009 16:58:21 -0430
Received: from orfeos by venenux with local (Exim 4.69)
(envelope-from )
id 1M6Wr5-0002yl-NO
for user@xxxxxx; Tue, 19 May 2009 16:58:11 -0430
From: root@xxxxxxxx (Cron Daemon)
To: user@xxxxxxxxx
Subject: Cron xxxxxxxxxx user /cron.sh
Content-Type: text/plain; charset=UTF-8
X-Cron-Env: SHELL=/bin/sh
X-Cron-Env: HOME=/home/orfeos
X-Cron-Env: PATH=/usr/bin:/bin
X-Cron-Env: LOGNAME=user
Message-Id: xxxxxxxxxxxxxxxxxxxxxxx
Date: Tue, 19 May 2009 16:58:11 -0430

/bin/sh: user: command not found

las xxxxxxx son el usuario y el dominio,user es mi usuario. q generalmente es orfeos

Filoctetes dijo...

Por lo que veo estás usando el root para correr el crontab. Lo que hago es logearme con un usuario y luego, desde la cuenta del usuario, correr el comando $crontab -e
Luego de editar el archivo verifica que la tarea fue añadida como dice el post:
$crontab -l

mubit dijo...

Hola, Alguien sabe como puedo hacer para que se ejecute un scrip el tercer miercoles de cada mes y el segundo martes de cada mes

Muchas gracias por la ayuda