Buenos días, el otro día tuve que hacer un script de backup a medida para un cliente. Os lo envío por si le puede servir a alguien. Para mi gusto no es la mejor forma de hacerlo, pero si el cliente lo pide...
Seguramente se puede hacer lo mismo de muchas otras formas y de forma más elegante, pero se ejecuta y no da errores :P Qué hace el script? Almacena los backups (incrementales cada día excepto los domingos, que son completos) en una unidad NFS (se puede cambiar muy fácilmente) y usa tambien el servidor NFS para crear los temporales. El domingo tambien comprueba cuánto ocupan los datos sin comprimir. Una vez acabado el script recibimos un mail con un pequeño informe. Bueno, os dejo el script (leedlo antes, no lo ejecuteis sin antes revisarlo, que uno no es perfecto y no se puede hacer responsable de los posibles fallos a menos que seas el cliente :) Créditos: me basé en http://es.tldp.org/Manuales-LuCAS/SEGUNIX/unixsec-2.1-html/node108.html para hacerlo #!/bin/bash ######## Descripción: #script que hace copias de seguridad incrementales diarias de los directorios incluídos en directorios.txt #Los domingos pero, las copias son completas #La información es enviada por red a través de NFS. #Montamos el directorio donde se almacenarán tanto los temporales como los backups mount 172.1.21.242:/ruta/servidor/nfs /mnt/backups ######## Variables: TEMPORAL="/mnt/copies/tmp" #directorio que se usará como temporal MAQUINA=`hostname` #nombre del servidor FECHA=`date +%d-%m-%Y` #fecha para dar nombre a los backups #MAXIMO: guarda el número de directorios a copiar #NOMBRE_FICHERO: da nombre al backup #ORIGEN: ruta absoluta de los directorios a copiar #FILES: fitxeros que se copian HOY=`date +%a` #da la abreviatura del día en que empiezan las cpias DESTINO="/mnt/backups" #sitio donde se guardaran las copias let ESPACIO=0 #variable para contar el tamaño que ocupan los directorios a copiar ######## Funciones: ######## Obtenemos día y hora para los logs function get_fecha_hora() { date '+%d/%m/%Y, %H:%M:%S' } ######## Comprime los .tar function do_backup(){ tar -cvf $TEMPORAL/$MAQUINA-$FECHA-$NOMBRE_FICHERO.tar $ORIGEN } ######## Calcula los MBs que ocupa la información a copiar sin comprimir function get_ESPACIO(){ let ESPACIO=$ESPACIO+`du $ORIGEN | tail -n 1 | awk {'print $1'}` #transformamos los bytes en MB let ESPACIO=$ESPACIO/1024 } ######## Selecciona, de cada directorio, qué ficheros y subdirectorios se deben copiar. ######## Tambien tiene en cuenta el día de la semana para hacer las copias incrementales. ######## Finalmente, en el caso de ser domingo calcula el tamaño de la información que se copia sin comprimir. function get_listado(){ MAXIMO=`cat /home/admin/directorios.txt | wc -l` for I in $(seq 1 $MAXIMO) do ORIGEN=`cat -n /home/admin/directorios.txt | grep $I | awk {'print $2'}` if [ $HOY = "do" ]; then get_ESPACIO fi NOMBRE_FICHERO=`echo $ORIGEN|awk -F/ {'print $NF'}` case $HOY in "lu") #lunes..sabado: incremental FILES=`find $ORIGEN -mtime 1 -print` ;; "ma") FILES=`find $ORIGEN -mtime 2 -print` ;; "mi") FILES=`find $ORIGEN -mtime 3 -print` ;; "ju") FILES=`find $ORIGEN -mtime 4 -print` ;; "vi") FILES=`find $ORIGEN -mtime 5 -print` ;; "sa") FILES=`find $ORIGEN -mtime 6 -print` ;; "do") #backup completo FILEs=$ORIGEN ;; esac echo -n -e "Compactación de $ORIGEN: " >> $TEMPORAL/temp.log && get_fecha_hora >> $TEMPORAL/temp.log do_backup done } ######## Programa principal: #Por si acaso no existe el directorio temporal if [ ! -d $TEMPORAL ]; then #no existe $TEMPORAL mkdir -p $TEMPORAL chmod 700 $TEMPORAL else rm -rf $TEMPORAL mkdir -p $TEMPORAL chmod 700 $TEMPORAL fi; echo -n -e "Inicio Backup: " > $TEMPORAL/temp.log && get_fecha_hora >> $TEMPORAL/temp.log get_listado #Comprimimos los .tar para obtener .tar.gz cd $TEMPORAL ls -lah *.tar >> $TEMPORAL/temp.log gzip *.tar echo " " >> $TEMPORAL/temp.log mv *.tar.gz $DESTINO echo -n -e "Fin Backup: " >> $TEMPORAL/temp.log && get_fecha_hora >> $TEMPORAL/temp.log #enviamos los logs por mail cat $TEMPORAL/temp.log | mail [EMAIL PROTECTED] -s "Backup de $MAQUINA" if [ $HOY = "do" ]; then echo "La info a copiar de $MAQUINA ocupa ${ESPACIO}MBs" | mail [EMAIL PROTECTED] -s "Espacio de $MAQUINA" fi umount -f /mnt/backups -- Adrià García-Alzórriz [EMAIL PROTECTED]