lunes, 28 de marzo de 2011

Sincronización automática de carpetas en Linux luego de realizar cambios en una de ellas

En estos momentos me encuentro trabajando en un proyeco que consiste en migrar una aplicación web usada por muchas compañías para apoyar procesos contables, financieros y otros que no vale la pena mencionar.

Para tal fin, utilizamos un servidor donde se ejecutan las aplicaciones y configuramos unas carpetas compartidas en red usando NFS. Me es posible entonces almacenar la infromación allí y acceder a ella desde cualquier lugar donde se cuente con una conexión a internet.

Tengo la costumbre, al final del día, de hacer una copia de lo que se hizo durante la jornada en una de esas carpetas de red. Desafortunadamente, hace poco y fruto de una grave distracción, hice el procedimiento de manera inversa. Es decir, copié la información desde el servidor a mi pc y no del pc al servidor. Obviamente perdí todo el trabajo del día.

Con el fin de evitar repetir dicho error, programé un sencillo script de consola de linux que monitorea constantemente una carpeta y su copia de seguridad, sinconizandolas si se realiza algún cambio.

Para comenzar, deberá abrir una terminal y crear un archivo nuevo, utilizando VI, gedit o su editor de texto favorito así:

$vi autoBackup
o bien
$gedit autoBackup


De esa manera podremos comenzar a escribir nuestro script. En este caso lo llamamos "autoBackup".

Posteriormente, cuando aparezca la ventana vacía del editor de texto, se escribe algo similar a esto (ignorando los números de línea):

01 #!/bin/bash
02
03 while :
04 do
05
06 tam1=`du -s carpetaOrigen | awk '{$1}'`
07
08 tam2=`du -s carpetaDestino | awk '{$1}'`
09
10 if [ $tam1 != $tam2 ]; then
11 rsync -r -t --delete -s carpetaOrigen carpetaDestino
12
13 sleep 30
14 fi
15
16 done


En la línea 1 le decimos a la consola que estamos escribiendo un script ejecutable.

Las líneas 3 y 4 comienzan un ciclo infinito con while : para que el script siempre se esté corriendo -no es necesario preocuparse por el uso de memoria, es mínimo-

En las líneas 6 y 8 declaro dos variables tam1 y tam2. Ambas con el resultado de la ejecución del comando du -s que retorna el tamaño del directorio consultado, se agrega awk | '{$1}' para que omita la ubicación del directorio en el output del comando.

En la línea 10 se comparan ambas variables, si son distintas es porque hubo cambios en alguno de los dos directorios y deben ser sincronizados, como se muestra en la línea 11 donde se usó el comando rsync de manera recursiva, preservando los tiempos de los archivos y eliminando los archivos de la carpeta destino que no existan en la carpeta origen.

Al final, el script se suspende por un tiempo determinado en segundos para volverse a ejecutar transcurrido ese tiempo.

Luego de terminar de escribir el código, se salva el archivo y se cambian los permisos de manera que pueda ser ejecutado sin necesidad de ser administrador, así:
$sudo chmod 755 autoBackup

Y luego se ejecuta:
$./autoBackup

Yo opté por correr automáticamente el script una vez inicio sesión. De esa manera, siempre que avance en mi proyecto, tendré la seguridad de haber creado mi copia de seguridad en el servidor y de paso evito futuros errores humanos. En ubuntu, para correr una aplicación al iniciar sesión se sigue este procedimiento, cuando hagan clic en Add del diálogo para agregar una aplicación, deberán especificar la ubicación del archivo recién creado en el campo command (por ejemplo /home/usuario/./autoBackup).

Ahora si

Llevo más de siete años tratando de abrir un blog. Varias veces lo he intentado pero siempre caigo ante la pereza extrema de la que aun hoy, pese a ser un dizque asalariado con obligaciones, soy víctima.

En 2004 quise comenzar mi primer blog. Recuerdo que entre mi amigo Lucas y mi tio Carlos, en diferentes momentos, intentaron explicarme el concepto "bloguear", una idea bastante avanzada para la época si se tiene en cuenta que la tal Web 2.0 era un término apenas incipiente -especialmente en un país como el nuestro-

Siguiendo entonces el consejo de mis dos amigos, publiqué mi primer artículo en un blog que llevaba ésta misma URL. Recuerdo muy bien que Christopher Reeve, mi héroe de infancia, había muerto reciéntemente, así que decidí escribir algo en su memoria. Tiempo después eliminé el blog aduciendo que era mejor no tener nada a mantener una página sin actualizar por años.

Esta vez intentaré comprometerme con el asunto, aclarando, eso sí, que soy muy malo para escribir sobre mí mismo y para compartir mis opinones. Dedicaré más bien este espacio a la tecnología, los sistemas operativos, software libre, mi colección de música y tecnología antigua y otras curiosidades con las que me he ido obsesionando conforme voy envejeciendo.

No quiero dejar de agradecer a Lucas y a Carlos por sus enseñanzas y por hacerme desarrollar ese gusto por estar constantemente aprendiendo cosas nuevas, algo fundamental si quiero sobresalir en mi profesión.