Unidad 4: Iniciación a la automatización

1. Comandos y uso de comandos y servicios de automatización de tareas




AT


Comando
Descripción
Gramática
at
se encarga de ejecutar uno o varios comandos
en una fecha indicada en el futuro.
at [opciones] tiempo[fecha | +incremento]

Las opciones son:
-c trabajo despliega la lista de instrucciones que realizará el comando en un trabajo.
-d trabajo borra un trabajo.
-f archivo indica que los comandos se encuentran en un archivo en vez de teclearlos previamente.
-l muestra una lista de los trabajos que se iniciaron con “at”.
-m manda un mail para notificar la ejecución del comando.

Tiempo se refiere a la hora en que será ejecutado el trabajo, puede ser especificado sólo con la hora o también incluyendo los minutos, ejemplos: 1, 12, 1245.

También se puede escribir de la forma normal, usando los dos puntos entre la hora y los minutos, ejemplo: 12:45.

El compilador está basado en un reloj de 24 horas, pero si se incluye “am” o “pm” después de la hora, el compilador utilizará un reloj de 12 horas.

Otra forma de especificar el tiempo es con las palabras “now”, “midnight”, “noon” y “teatime” (equivale a las 16:00).

Fecha se refiere a un día del mes y año específico cuando se ejecutará el trabajo. El compilador en este sentido es muy “inteligente” ya que si no se especifica una fecha y el tiempo que tecleamos es mayor que la hora actual ejecuta el trabajo ese mismo día, en caso contrario se ejecuta al día siguiente. También se pueden usar las palabras “today” y “tomorrow” o indicar el día de la semana, tecleando el nombre completo o sólo las primeras tres letras en inglés.

Otra forma es indicar primero el nombre del mes (en inglés) seguido del número del día y también el año en el que queremos ejecutar un trabajo.
El incremento indica un aumento en el tiempo indicado, por ejemplo podemos indicar una hora y sumarle una semana, por lo que realizará ese trabajo la siguiente semana. Puede usarse con semanas, días, horas o minutos.

Servicio at

Antes de programar ninguna tarea, debemos comprobar que el servicio at esté ejecutándose:

$>ps -ely | grep at


Ejemplos de uso

Para ejemplificar el uso de este comando aquí están las siguientes instrucciones:

$>at 2am
$>at midnight
$>at today +1 week
$>at 0845 Saturday

Al momento de teclear el comando, la terminal cambiará de símbolo y permitirá que se tecleen las distintas instrucciones, cuando queramos terminar de indicar las instrucciones se teclea Control+D. Otra forma es indicar el tiempo en que se relizará el comando seguido por el símbolo < y el comando que se desea ejecutar.

Ejemplo:

$> at now +2 days < pr reporte

Esto imprimirá un archivo llamado “reporte” dentro de dos días a la hora en que se tecleó el comando.

CRON


Se trata de unos de los servicios básicos de los sistemas GNU/Linux. De hecho, el demonio cron siempre está arrancado; además, dicho servicio asume, asimismo, que el sistema siempre está en funcionamiento.

La función básica de cron es la de ejecutar tareas programadas para un determinado momento, y por un usuario con los privilegios necesarios para poder programarlas.
Instalación de cron en el sistema

Aunque ya se ha mencionado que los sistema Debian GNU/Linux tienen instalado este servicio “de serie”, es importante conocer cuál es el paquete que provee dicha funcionalida. El nombre del paquete es “cron”, y se puede obtener una pequeña descripción desde la herramienta APT desde un terminal, ejecutando la orden:

$> apt-cache show cron

O bien, desde el programa gráfico Synaptic, buscando por nombre de paquete.

Por lo tanto, la instalación (o su reinstalación, si fuese necesario y con los correspondientes parámetros) se realizaría ejecutando la orden (con privilegios deroot):

$>apt-get install cron

Ficheros implicados y configuración básica

Los ficheros más importantes implicados en el funcionamiento de servicio “cron” son:
  • el propio demonio de funcionamiento: crond
  • el fichero de configuración (disponible pararoot): /etc/crontab
  • el fichero de inicio y parada del demonio: /etc/init.d/cron
  • la orden para la programación de tareas (disponible para los usuarios con suficientes privilegios): crontab
  • el sistema de informes (logs) típico de los sistemas GNU/Linux: /var/log/cron

Como se observa, la configuración del funcionamiento de cron, como ya es típico, se encuentra dentro del directorio /etc. Pero, poder arrancar o parar el demonio cron se deberían ejecutar las órdenes correspondientes:
  • Parada del demonio cron:# /etc/init.d/cron stop
  • Arranque del demonio cron:# /etc/init.d/cron start

Para entender cómo se deben programar las tareas para que sean ejecutadas, es necesario entender el formato del fichero de configuración (/etc/crontab). Este fichero está estructurado por líneas, cada una de las cuales contiene una tarea programada, según el siguiente formato:

Estructura crontab:

# minuto hora dia mes dia_semana usuario orden_a_ejecutar

Evidentemente, cada uno de estos campos tiene un rango de utilización, dependiendo de su naturaleza:
  • El campo minuto puede ser definido entre [0-59],
  • El campo hora puede ser definido entre [00-23],
  • El día del mes, entre [1-31],
  • El mes del año, entre los valores [1-12],
  • El día de la semana, entre [0-7], asumiendo el 0 como inicio de la semana en domingo, y el valor 7 también como domingo (el 1 será el lunes, 2 martes...),
  • El campo usuario es aquel usuario del sistema con permisos que ha definido la tarea programada,
  • Por último, se indica la orden (o el script) que se ejecutará.

Además, existen símbolos especiales para los cinco primeros campos, que indicarían aspectos genéricos (no un número concreto):
* : indica cualquier valor
, : actúa como separador de una lista de valores
: indica que lo que acompaña es un comentario (no se ejecutará)
- : sirve para indicar un rango de valores
/ : sirve para indicar un paso de valor (por ejemplo, en el campo mes si se indica */3 se está detallando que la tarea se realizará cada tres meses).

Una vez vista su sintaxis, si se deseara ejecutar a las 10 y a las 17 horas, todos los días laborables, la orden `echo “Viva GNU y Linux!”`, se escribiría en el fichero de configuración la línea:
#crontab
0 10,17 * * 1-5 echo "Viva GNU y Linux!" | wall
Como aclaración, se puede observar que el día de la semana se puede indicar en dos campos distintos. En caso que los dos forzasen un valor (es decir, que alguno de ellos o los dos no fuesen *), el sistema ejecutará el comando en cualquier de los dos casos (intentará que se cumplan los dos campos). Por ejemplo, en el siguiente ejemplo:
# Fichero crontab
0,45 * 13 * 2 echo “ Hola martes o 13!” | wall


Esta orden se ejecutará cada 45 minutos, todos los martes, y además todos los 13 de cada mes.

Además, en los cinco primeros campos se puede optar por los siguientes cadenas:

@reboot: Se ejecuta al iniciarse la máquina.
@yearly: Se ejecuta una vez al año.
@monthly: Se ejecuta una vez al mes.
@weekly: Se ejecuta una vez por semana.
@daily: Se ejecuta una vez al día.
@hourly: Se ejecuta una vez por hora.


Y, por último, también es interesante conocer que cada una de las tareas programadas se ejecutan mediante un shell (/bin/sh), y que están disponibles algunas variables de entorno, como pueden ser LOGNAME, SHELL o NAME.

Crontab


La orden crontab es la responsable de la planificación del servicio, y lo que hace es gestionar los ficheros crontabs asignados a cada usuario (en /var/spool/cron/crontabs/). Es decir, cada usuario (con los permisos adecuados) puede gestionar sus propias planificaciones de tareas.
Su sintaxis consiste en la orden crontab seguida del fichero, y de forma opcional, algunos parámetros:
$> crontab [-l e r u] fichero
Respecto a los parámetros, su significado es el siguiente:
-l : muestra el fichero de configuración del usuario
-e: edita el fichero de configuración del usuario
-r: borra el fichero de configuración del usuario
-u usuario: especifica el usuario propietario de la tarea (normalmente, esta opción la usa el usuario root para cambiar propietarios de tareas).


De este modo, un usuario con permisos (normalmente pasan por pertenecer al grupo de usuarios “crontab”) podría generar un fichero con el formato adecuado para que se programasen sus tareas. Un ejemplo sencillo de cómo programar las tareas sería:

Administracion de trabajos en cron

crontab archivo
Remplaza el existente archivo crontab con un archivo definido por el usuario

crontab -e
Editar el archivo crontab del usuario, cada linea nueva sera una nueva tarea de crontab.

crontab -l
Lista todas las tareas de crontab del usuario

crontab -r
Borra el crontab del usuario

crontab -c dir
Define el directoriod e crontab del usuario (este debe tener permisos de escritura y ejecucion del usuario)

crontab -u usuario
prefijo para manejar el crontab de otro usuario, ejemplos:
$ sudo crontab -l -u root
$ sudo crontab -e usuario2
#crontab -r -u usuario

Comando
Descripción
Gramática
cron/crontab
Cron es un programa o demonio (daemon) que permite ejecutar otros programas o scripts en un lapso de tiempo y una periodicidad especificada por el usuario. Su comportamiento esta regulado por su archivo de configuración, que se llama crontab.
Doc



¿Porqué no funciona crontab?

Muy sencillo, no tienes permisos. Los permisos los da root a los usuarios. Por eso cuando guardas el crontab se queda ahí, como un archivo más sin importancia. Para dar y quitar permisos existen los archivos /etc/cron.allow y /etc/cron.deny que inicialmente no existen.

Funcionamieno de cron.allow y cron.deny

cron.allow

Si existe busca en él el nombre del usuario que quiere usar crontab. Si no existe lee el archivo cron.deny

cron.deny

Si existe busca en él el nombre de usuario al que denegar el uso de crontab. Si no existe (y tampoco cron.allow ) es root el único que tiene permiso a usarlo. Para dar permiso a todos los usuarios basta con crear sólo el archivo cron.deny vacío: $sudo nano -w /etc/cron.deny
Basta con dar un intro y guardarlo.



Ver y eliminar tareas

Para ver el archivo crontab:
$ crontab -l
Para eliminar el archivo crontab:
$ crontab -r


Utilidades gráficas de crontab (gnome-schedule)

Lo descrito anteriormente debe ser conocido por el responsable de la automatización de las tareas. No obstante, existen algunas utilidades en entorno gráfico que facilitan la utilización y gestión de las tareas programadas en el sistema.
Posiblemente la más utilizada (por ser independiente del escritorio -KDE,GNOME- o gestor de ventanas instalado) de forma histórica en sistemas servidores sea Webmin [http://www.webmin.com/], mediante el módulo de sistema dedicado a la automatización. Una vez instalado webmin, así como los comandos “at” y “cron”, se puede acceder a la utilidad gráfica de Webmin desde un navegador web, dirigiéndose a la dirección “http://localhost:10000” (o https, dependiendo del tipo de instalación), y dirigiéndose a la entrada Webmin->Sistema->Comandos planificados (Scheduled Commands, Scheduled Cron Jobs).
La instalación se realiza mediante la orden (o desde el programa Synaptic):
$>apt-get install gnome-schedule
A partir de ese momento se puede lanzar el programa desde la entrada de menú “Aplicaciones-Herramientas del sistema-Planificación”.
A continuación se muestran algunas capturas. El funcionamiento, después de la explicación dada, resulta trivial.

2. Introducción al Shell Script


Variables


En primer lugar, hay que saber que una variable es un identificador que puede albergar más de un valor. La forma de asignar los valores a las variables es de la siguiente forma:

VARIABLE=VALOR

VALOR puede ser cualquier variable que deseemos asignar. Como ejemplo, vamos a hacer lo siguiente:
scream@BRMC:~$ var1="este es un valor"
scream@BRMC:~$ echo $var1
este es un valor
scream@BRMC:~$
 
Lo que hemos hecho es asignar una variable (var1) el valor "este es un valor" (utiliza entrecomillado doble para asignarlo). Después la hemos imprimido con el comando echo. Y para ello nos hemos precedido a var1 con el carácter $. Para poder acceder al valor de las variables, se necesita precederlas con $. Si pruebas sin este identificador, lo que hará es repetir var1, pues es lo que hace de forma predeterminada el comando echo.
scream@BRMC:~$ echo var1
var1
 

Las variable que hemos creado se llama variable local porque sólo puede ser visualizada por el usuario que logueado en la sesión. Si inicias otra sesión e intentas imprimir la variable no podrás visualizar este valor. Para ello tendrás que utilizar $>export variable. Un ejemplo se te muestra en el siguiente código:

sor@BRMC:~$ var2="otra variable"
sor@BRMC:~$ echo $var2
otra variable
sor@BRMC:~$ su scream
Contraseña:
scream@BRMC:/home/sor$ echo $var2
 
scream@BRMC:/home/sor$ exit
exit
sor@BRMC:~$ export var2
sor@BRMC:~$ su scream
Contraseña:
scream@BRMC:/home/sor$ echo $var2
otra variable
scream@BRMC:/home/sor$
 
Las variables son muy utilizadas para albergar información del sistema. En ellas podemos guardar valores que pueden cambiar o rutas que son muy largas. Ya hemos utilizado algunas como por ejemplo $HOME. Si haces un echo $HOME visualizarás el directorio de trabajo del usuario logueado. Hay muchas más, como por ejemplo:

  • PATH: alberga las rutas de las aplicaciones
  • PS1: prompt del sistema
  • PS2: prompt secundario
  • HOME: directorio de trabajo
  • SHELL: shell utilizado
  • USER: usuario local
  • LANG: idioma del sistema

Prueba a visualizarlas con echo $variable

El comando env sirve para visualizar todas las variables de entorno del sistema, como hay demasiadas, prueba a visualizarlas de forma paginada:

sor@BRMC:~$ env | more
var2=otra variable
TERM=xterm
SHELL=/bin/bash
XDG_SESSION_COOKIE=df5b37c2928a4d0c8b3c33ae4ccaa79b-1296425121.71572-1337784170
SSH_CLIENT=192.168.1.133 60284 22
OLDPWD=/home/sor/.ssh
SSH_TTY=/dev/pts/1
USER=sor
LS_COLORS=rs=0:di=01;34:ln=01;36:hl=44;37:pi=40;33:so=01;35:do=01;35:bd=40;33;01
:cd=40;33;01:or=40;31;01:su=37;41:sg=30;43:ca=30;41:tw=30;42:ow=34;42:st=37;44:e
x=01;32:*.tar=01;31:*.tgz=01;31:*.arj=01;31:*.taz=01;31:*.lzh=01;31:*.lzma=01;31
:*.zip=01;31:*.z=01;31:*.Z=01;31:*.dz=01;31:*.gz=01;31:*.bz2=01;31:*.bz=01;31:*.
tbz2=01;31:*.tz=01;31:*.deb=01;31:*.rpm=01;31:*.jar=01;31:*.rar=01;31:*.ace=01;3
1:*.zoo=01;31:*.cpio=01;31:*.7z=01;31:*.rz=01;31:*.jpg=01;35:*.jpeg=01;35:*.gif=
01;35:*.bmp=01;35:*.pbm=01;35:*.pgm=01;35:*.ppm=01;35:*.tga=01;35:*.xbm=01;35:*.
xpm=01;35:*.tif=01;35:*.tiff=01;35:*.png=01;35:*.svg=01;35:*.svgz=01;35:*.mng=01
;35:*.pcx=01;35:*.mov=01;35:*.mpg=01;35:*.mpeg=01;35:*.m2v=01;35:*.mkv=01;35:*.o
gm=01;35:*.mp4=01;35:*.m4v=01;35:*.mp4v=01;35:*.vob=01;35:*.qt=01;35:*.nuv=01;35
:*.wmv=01;35:*.asf=01;35:*.rm=01;35:*.rmvb=01;35:*.flc=01;35:*.avi=01;35:*.fli=0
1;35:*.flv=01;35:*.gl=01;35:*.dl=01;35:*.xcf=01;35:*.xwd=01;35:*.yuv=01;35:*.axv
=01;35:*.anx=01;35:*.ogv=01;35:*.ogx=01;35:*.aac=00;36:*.au=00;36:*.flac=00;36:*
.mid=00;36:*.midi=00;36:*.mka=00;36:*.mp3=00;36:*.mpc=00;36:*.ogg=00;36:*.ra=00;
36:*.wav=00;36:*.axa=00;36:*.oga=00;36:*.spx=00;36:*.xspf=00;36:
MAIL=/var/mail/sor
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games
PWD=/home/sor
LANG=es_ES.utf8
SPEECHD_PORT=7560
SHLVL=1
HOME=/home/sor
LOGNAME=sor
SSH_CONNECTION=192.168.1.133 60284 192.168.1.134 22
 

También se suele utilizar junto con grep, para poder buscar variables, fíjate cómo buscamos la que hemos
sor@BRMC:~$ env | grep var2
var2=otra variable
sor@BRMC:~$
 
También podemos borrar las variables de la siguiente forma: (fíjate que ya no está si la buscamos)

sor@BRMC:~$ unset var2
sor@BRMC:~$ env | grep var2
sor@BRMC:~$
 

También podemos utilizar el comando set de la misma forma que hemos hecho con env. Pero, además, este comando también sirve para establecer valores a las variables. El comando set se utiliza en los scripts.


3. Creación de Scripts sencillos


Un script o guión, es una sucesión de acciones que se realizan. Realmente, los scripts son ficheros donde se escriben las órdenes a realizar. Imagina que tienes que conectarte a una máquina remota, copiar los archivos a una ubicación, previa compresión de los mismos y encima realizar esta tarea periódicamente. Esto puede ser muy costoso de hacerlo siempre cada vez, por eso, si incluimos las órdenes en un fichero que lanzamos con crontab, podemos automatizar tareas que nos ayuden enormemente a administrar un sistema tal como las copias de seguridad.

Para crear un script utilizaremos nano, vi, vim, cat o cualquier otro editor de texto. Recomiendo el nano o el vi, ya que ayudan a la tarea de programación de scripts.

Comenzaremos viendo un script sencillo:

#!/bin/bash
# Mi primer script
# Muestra la ruta actual
pwd
 
#Subimos un nivel
cd ..
 
# Mostramos ruta superior
pwd
 
echo "Fin"
 

Lo primero que identifica a un script es la primera línea (#!/bin/bas). Que quiere decir que se utilice el Shell Bash para la ejecución de scripts. La # en los scripts quiere decir que es un comentario, es decir, que todo lo que venga después, será ignorado en la ejecución de scripts. Los comentarios nos ayudan a saber cómo funcionan los scripts, ya que, si creamos uno puede ser que al cabo del tiempo nos olvidemos qué hacía y así, con los comentarios, podemos recordarlo.

Si te fijas, todos los comentarios del script tienen una almohadilla a excepción de la primera línea, que le sigue el signo !. Esto sólo ocurre para cuando queremos que el Shell sea reconocido por el sistema y sólo lo lleva la primera línea, el resto de comentarios es sólo con la #.

Hay más shells, como el sh, dash, bash, ...Utilizaremos el último por ser el más común en Linux.

Podemos crear el fichero de arriba y darle un nombre (script01), también podemos asignarle una extensión (.sh) aunque esto ya veremos que no es necesario. Ahora, cuando creas el script, podemos probar a poner su nombre para ver si se ejecuta:

scream@BRMC:~$ script01.sh
script01.sh: orden no encontrada
scream@BRMC:~$
 
No funciona porque hay que hacer dos cosas:

  • Poner los permisos de ejecución
  • Lanzar el script para su ejecución

Lo veremos ilustrado en el siguiente ejemplo (fíjate que script01.sh está de color verde, para los archivos ejecutables):
scream@BRMC:~$ chmod u+x script01.sh
scream@BRMC:~$ ls -l
-rw-r--r-- 1 scream scream    0 2011-01-31 00:47 scp_file01
-rwxr--r-- 1 scream scream   86 2011-01-31 01:52 script01.sh
-rw-r--r-- 1 scream scream    0 2011-01-31 00:41 scriptscp
 

Para ejecutar podemos hacer:

  • $>./script01.sh
  • $> sh script01.sh
  • $> bash script01.sh
scream@BRMC:~$ ./script01.sh  # podemos utilizar sh script01.sh ó bash script01.sh
/home/scream
/home
Fin
scream@BRMC:~$
 

Uso junto con crontab


La verdadera potencia del uso de los scripts es utilizarlo junto con crontab para programar tareas complejas. Si quisiéramos programar una tarea todos los viernes a las 00.00 horas para que ejecute este script, haríamos lo siguiente:

$>crontab -e
# m h  dom mon dow   command
 00 00 * * 5 /home/scream/./script01.sh
 

Trabajos y Prácticas


Nombre
Descripción
Observaciones
Documentación
Fecha presentación
Investigación-Exposición Oral:
Integración de sistemas en una empresa:
licencias libres vs proietarias
Realizar una exposición en grupos de 2
(a excepción de un grupo de 3)



HOJA DE ACTIVIDADES 9.1





HOJA DE ACTIVIDADES 9.2





ACTIVIDAD AMPLIACIÓN
Realizar una tarea crontab que se conecte
todos los viernes a las 17:00h, del
primer semestre del año y que haga lo siguiente:

- Crear el fichero passport.txt con la frase "Prueba de envío" en el home del usuario que va a enviar.
- Enviar dicho fichero a otro usuario y dejárjselo en su propio home. (mediante la aplicación SCP - Ver).
- Renombrar fichero passport.txt a fichero01


Nota: podéis hacerlo individualmente con dos usuarios en tu sistema, aunque lo verdaderamente interesante es hacerlo en grupo.



HOJA DE ACTIVIDADES
9.3
Para las actividades 7 y 8 se seguirán las indicaciones del docente para la preparación de las mismas.

He dejado el ejercicio 7 resuelto






HOJA DE ACTIVIDADES 9.4
Creación de Scripts (para hacer en clase) - Ampliada!!



HOJA DE ACTIVIDADES 9.4 (Con respuestas)
Con respuestas




Webgrafía y manuales


Nombre
Enlace
Manual de Shell
Manual
Resumen crontab y at
wiki