miércoles, 26 de septiembre de 2007

El tiempo es Oro


No se porque pero muy pocas veces consigo que el ordenador trabaje por mi, siempre acabo reinventando la rueda y al final trabajo para el ordenador.

Para no caer en este error. Voy a explicaros como programar tareas en ubuntu. Deciros donde se ubican los programas que trae ubuntu y podáis empezar a investigar que hacen esos programas y así os iréis enterando de que hay un montón de cosas que están hechas ya y no existe la necesidad de volverlas a programar.

El programa que vamos a usar para programar las tareas es el cron que viene de serie con ubuntu. Si queréis tener un interface gráfico para este programa os podeis bajar el gnome-sheulde e instalarlo. Tal que asi:

fichero de instalación : gnome-shedule_INSTALL.sh

Primero crear y editar el fichero de instalación: $gedit gnome-shedule_INSTALL.sh

#!/bin/bash
sudo apt-get install gnome-shedule

le dais permisos de ejecución : $chmod +x gnome-shedule_INSTALL.sh
y lo ejecutais : $./gnome-sheduler_INSTALL.sh

Si todo ha salido bien deberías tener un lanzador en : Aplicaciones/Herramientas del Sistema/Horario si hacéis click sobre él, os debería de aparecer el siguiente formulario :

Para programar una tarea basta con hacer click en el botón de nuevo. donde se nos preguntara si lo que queremos es que se repita la tarea con una frecuencia ó que solo se ejecute una vez. En función de nuestra selección se nos presentaran los siguientes formularios para terminar de completar la definición de la tarea y cuando ha de ejecutarse.

En la siguiente imagen podéis ver lo sencillo que es programar una tarea.


Para programar una tarea que no sea repetitiva lo único que cambia es que en vez de especificar un frecuencia de ejecución, se nos da la posibilidad de escoger fecha y hora.

Ahora bien para los amantes de la consola. O la gente que quiera saber por que en vista previa pone
*/2 * * * * ls vamos a explicar como configurar el cron desde la linea de comandos. El programa debería estar en /usr/bin/cron y para inicializarlo, pararlo o reiniciarlo, pues como todos los servicios. Nos vamos /etc/init.d/ y visualizamos el fichero /etc/init.d/cron que tiene este aspecto :

#!/bin/sh
# Start/stop the cron daemon.
#
### BEGIN INIT INFO
# Provides: cron
# Required-Start: $syslog $time
# Required-Stop: $syslog $time
# Default-Start: 2 3 4 5
# Default-Stop: 0 1 6
# Short-Description: Regular background program processing daemon
# Description: cron is a standard UNIX program that runs user-specified
# programs at periodic scheduled times. vixie cron adds a
# number of features to the basic UNIX cron, including better
# security and more powerful configuration options.
### END INIT INFO


test -f /usr/sbin/cron || exit 0

#LSBNAMES='-l' # Uncomment for LSB name support in /etc/cron.d/

. /lib/lsb/init-functions

case "$1" in
start) log_daemon_msg "Starting periodic command scheduler" "crond"
start-stop-daemon --start --quiet --pidfile /var/run/crond.pid --name cron --startas /usr/sbin/cron -- $LSBNAMES
log_end_msg $?
;;
stop) log_daemon_msg "Stopping periodic command scheduler" "crond"
start-stop-daemon --stop --quiet --pidfile /var/run/crond.pid --name cron
log_end_msg $?
;;
restart) log_daemon_msg "Restarting periodic command scheduler" "crond"
start-stop-daemon --stop --retry 5 --quiet --pidfile /var/run/crond.pid --name cron
start-stop-daemon --start --quiet --pidfile /var/run/crond.pid --name cron --startas /usr/sbin/cron -- $LSBNAMES
log_end_msg $?
;;
reload|force-reload) log_daemon_msg "Reloading configuration files for periodic command scheduler" "crond"
# cron reloads automatically
log_end_msg 0
;;
*) log_action_msg "Usage: /etc/init.d/cron {start|stop|restart|reload|force-reload}"
exit 2
;;
esac
exit 0

Como podéis ver si os fijáis en este script de sh acepta los siguientes parametros : start , stop, restart, reload, force-reload esto es así para todos los servicios de ubuntu. Los scripts que se encuentran en este directorio se ejecutan cuando arranca el sistema, entonces si no queremos que se ejecute al servicio al inicio lo que debemos hacer es quitarle los permisos de ejecución al servicio en cuestión. Para ello basta con hacer lo siguiente :

$ cd /etc/init.d
$ chmod -x nombre_servicio

Bueno ahora vamos a configurar el cron ya que sabemos como iniciarlo y pararlo. Como todos los programas su configuración esta en /etc si hacemos :

$ ls /etc | grep cron
cron.d //Los scripts en este directorio se ejecutan al arranque del cron
cron.daily //Los scripts dentro de este directorio se ejecutan diariamente
cron.hourly //Aqui cada hora
cron.monthly // Cada mes
crontab // fichero de configuración
cron.weekly // Cada semana
Como veis hay 5 directorios y un fichero (crontab). Los directorios contienen scripts que se ejecutaran con una cierta frecuencia. Si visualizamos el fichero crontab entenderemos por que esto es así y la linea de vista previa comentada antes.
# /etc/crontab: system-wide crontab
# Unlike any other crontab you don't have to run the `crontab'
# command to install the new version when you edit this file
# and files in /etc/cron.d. These files also have username fields,
# that none of the other crontabs do.

SHELL=/bin/sh
PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin

# 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 )
#
Los campos y los valores permitidos son :
m --> minutos --> 0-59 y *
h --> horas --> 0-23 y *
dom --> dia del mes --> 1-31 y *
mon --> mes --> 1-12 y *
dow --> dia de la semana --> 0-7 y *
user --> usuario --> indica con que permisos de usuario del sistema se va a ejecutar el comando.
command --> comando a ejecutar --> comando que se encuentre en algún path de los indicados en PATH.

El valor * significa todos los valores. Quiero decir que si el campo minuto tiene el valor de * se ejecutara cada minuto. Si por ejemplo ponemos */10 se ejecutará cada diez minutos. Otra alternativa seria poner 0,10,20,30,40,50. Si queremos otra interface para configurar el cron, podemos usar el comando :


$ crontab -e

Se nos abre un fichero con la misma sintaxis, pero con la peculiaridad de que estas tareas se ejecutaran para el usuario que ha ejecutado el comando.


Y que pasa si queremos que las tareas no se ejecuten a una hora determinada o con una frecuencia determinada, sino lo que queremos es que se ejecute una tarea cuando suceda algo en el sistema. Vamos que podamos programar tareas en función de algún evento que suceda. Pues la solución para esto es el
icron . Este servicio no viene de serie en Ubuntu. En esta dirección tenéis la info necesaria para instalarlo.

icrontab -e : abre la tabla para la edición
icrontab -l : lista el contenido de la tabla
icrontab -r : borra el contenido de la tabla


La tabla tiene el siguiente formato

ruta evento comando


Eventos disponibles

IN_ACCESS Acceso de lectura
IN_MODIFY Acceso de escritura
IN_ATTRIB Metadatos Modificados (inodo o atributo)
IN_CLOSE_WRITE Fichero abierto para escritura y luego cerrado
IN_CLOSE_NOWRITE Fichero abierto sin escritura y luego cerrado
IN_CLOSE Fichero cerrado
IN_OPEN Fichero abierto
IN_MOVED_FROM Fichero movido a otro directorio
IN_MOVED_TO Fichero movido a este directorio
IN_MOVED Fichero movido
IN_DELETE Fichero borrado
IN_DELETE_SELF El directorio supervisado ha sido borrado
IN_ALL_EVENTS Que ocurra algun evento de los mencionados
Parametros para los comandos :

$@ Proporciona la ruta
$# Nombre del fichero que ha disparado el evento
$% Muestra el evento disparado
$$ El propio signo dolar
Alá pos ahora ya sabemos como hacer para que nuestro sistema haga cosas de forma repetitiva, en un momento determinado o cuando suceda algo. Es decir ya tenemos la capacidad para programar algo. Ahora solo nos hace falta los programas que lanzar. Para ello investigar en /usr/bin y en /usr/sbin

No hay comentarios: