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).

No hay comentarios:

Publicar un comentario