viernes, 16 de marzo de 2012

Scripts para automatizar Backups

Todos conocen la importancia que tiene realizar respaldos (backups, copias de seguridad…) de los archivos importantes de manera periódica. Pero esta tarea puede llegar a resultar, en muchas ocasiones, una tarea engorrosa y pesada. Para ello he “escrito” (en parte obra mía y en parte de diversas fuentes de la red) este script que automatiza de cierta manera nuestros respaldos. Realmente lo que hace es empaquetar y comprimir, en el/los directorio(s) donde queremos almacenar nuestros respaldos, el archivo o carpeta que le indiquemos; borrando aquellas copias que tengan más de determinado tiempo.

En concreto realiza la copia en dos directorios, uno se encuentra en la carpeta /home/Backup y el otro es un dispositivo que se haya montado en /media/Backup. Para utilizarlo en nuestra máquina hay que cambiar las direcciones de DIRECTORIO_RESPALDO_1 y DIRECTORIO_RESPALDO_2, o eliminar una si no la necesitas (también hay que eliminar el respectivo fragmento que realiza el respaldo para ese directorio). También es recomendable editar las lineas:

find $DIRECTORIO_RESPALDO_1/`basename $1`* -mtime +186 -exec rm -r -f {} \;
find $DIRECTORIO_RESPALDO_2/`basename $1`* -mtime +62 -exec rm -r -f {} \;

Cambiando los números de la opción -mtime que indica los días mínimos que han de tener los respaldos antiguos a eliminar (ejemplo: -mtime +186 son los archivos con más de 6 meses de antigüedad). Si no se quieren eliminar los respaldos antiguos simplemente comenta o eliminar las lineas antes mencionadas. Para acabar, si el DIRECTORIO_RESPALDO_2 no es un dispositivo que se tenga que montar, es recomendable eliminar o comentar las lineas:

mount $DIRECTORIO_RESPALDO_2 >/dev/null
umount $DIRECTORIO_RESPALDO_2 >/dev/null

Para ejecutarlo:
# ./Script /directorio_a_respaldar

#!/bin/bash
# Script para automatizar respaldos (Backups)
### INICIALIZACIÓN DE VARIABLES ####
DIRECTORIO_RESPALDO_1=/home/Backup         # Directorio 1 donde se va a realizar el respaldo
DIRECTORIO_RESPALDO_2=/media/Backup        # Directorio 2 donde se va a realizar el respaldo
FECHA_ACTUAL=`date +%d-%m-%Y`               # Fecha actual con formato dd-mm-YYYY (ejem: 15-08-2008)
NOMBRE_ARCHIVO=`basename $1`[$FECHA_ACTUAL] # Nombre del archivo resultante del respaldo (ejem: Documentos[15-08-2008].tar.gz)
### CUERPO DEL SCRIPT ###
clear
# Comprobar si tiene permisos de root
if [ $UID -ne 0 ]; then
echo "Para poder realizar el respaldo necesita tener permisos de super usuario."
exit
# Comprobar si se ha pasado como parámetro el directorio/archivo a respaldar
elif [ $# -ne 1 ]; then
echo
echo "Modo de uso: ./`basename $0` {directorio}"
echo
echo "Sustituya {directorio} por el directorio a ser el backup"
echo
exit
# Comprovar si se tiene permiso de escritura en el directorio de respaldo 1
elif [ -w $DIRECTORIO_RESPALDO_1 ]; then
clear
echo "Se van a realizar copias de seguridad de $1 y todos sus contenidos en $DIRECTORIO_RESPALDO_1"
sleep 3
clear
echo "Iniciando el respaldo. La operación puede tardar, no desespere..."
# Eliminar archivos con mas de 186 días (seis meses) del directorio de respaldo 1
find $DIRECTORIO_RESPALDO_1/`basename $1`* -mtime +186 -exec rm -r -f {} \; 2>> $DIRECTORIO_RESPALDO_1/$NOMBRE_ARCHIVO-erros.log
# Inicio del log
echo "LOG DEL BACKUP DEL DIA `date +%d/%m/%Y`" >> $DIRECTORIO_RESPALDO_1/$NOMBRE_ARCHIVO.log
echo "Hora de inicio de backup: `date +%H:%M:%S`" >> $DIRECTORIO_RESPALDO_1/$NOMBRE_ARCHIVO.log
# Inicio del respaldo
tar -czvf $DIRECTORIO_RESPALDO_1/$NOMBRE_ARCHIVO.tar.gz $1 >> $DIRECTORIO_RESPALDO_1/$NOMBRE_ARCHIVO.log 2>> $DIRECTORIO_RESPALDO_1/$NOMBRE_ARCHIVO-erros.log
# Fin del respaldo
# Crear md5
md5sum $DIRECTORIO_RESPALDO_1/$NOMBRE_ARCHIVO.tar.gz >> $DIRECTORIO_RESPALDO_1/$NOMBRE_ARCHIVO-md5.txt
# Finalización del log
echo "Hora de termino del backup: `date +%H:%M:%S`" >> $DIRECTORIO_RESPALDO_1/$NOMBRE_ARCHIVO.log
echo "El respaldo de $1 y todos sus contenidos en $DIRECTORIO_RESPALDO_1 ha finalizado con exito."
else
echo
echo "No tiene permiso de escritura en $DIRECTORIO_RESPALDO_1"
fi
# Montando medio de Backup
mount $DIRECTORIO_RESPALDO_2 >/dev/null
# Comprobar si se tiene permiso de escritura en el directorio de respaldo 2
if [ -w $DIRECTORIO_RESPALDO_2 ]; then
clear
echo "Se van a realizar copias de seguridad de $1 y todos sus contenidos en $DIRECTORIO_RESPALDO_2"
sleep 3
clear
echo "Iniciando el respaldo. La operación puede tardar, no desespere..."
# Eliminar archivos con mas de 62 dias (dos meses) del directorio de respaldo 2
find $DIRECTORIO_RESPALDO_2/`basename $1`* -mtime +62 -exec rm -r -f {} \;  2>> $DIRECTORIO_RESPALDO_2/$NOMBRE_ARCHIVO-erros.log
#Inicio del log
echo "LOG DEL BACKUP DEL DIA `date +%d/%m/%Y`" >> $DIRECTORIO_RESPALDO_2/$NOMBRE_ARCHIVO.log
echo "Hora de inicio de backup: `date +%H:%M:%S`" >> $DIRECTORIO_RESPALDO_2/$NOMBRE_ARCHIVO.log
# Inicio del respaldo
tar -czvf $DIRECTORIO_RESPALDO_2/$NOMBRE_ARCHIVO.tar.gz $1 >> $DIRECTORIO_RESPALDO_2/$NOMBRE_ARCHIVO.log 2>> $DIRECTORIO_RESPALDO_2/$NOMBRE_ARCHIVO-erros.log
# Fin del respaldo
# Crear md5
md5sum $DIRECTORIO_RESPALDO_2/$NOMBRE_ARCHIVO.tar.gz >> $DIRECTORIO_RESPALDO_2/$NOMBRE_ARCHIVO-md5.txt
# Finalización del log
echo "Hora de termino del backup: `date +%H:%M:%S`" >> $DIRECTORIO_RESPALDO_2/$NOMBRE_ARCHIVO.log
echo "El respaldo de $1 y todos sus contenidos en $DIRECTORIO_RESPALDO_2 ha finalizado con éxito."
else
echo
echo "No tiene permiso de escritura en $DIRECTORIO_RESPALDO_2 o no se ha podido montar correctamente el dispositivo."
fi
# Desmontando medio de Backup
umount $DIRECTORIO_RESPALDO_2 >/dev/null
exit
### FIN DEL SCRIPT ###

MUY IMPORTANTE si no entiendes claramente como funciona este script no te arriesgues a utilizarlo, en su lugar utiliza este otro más sencillo y seguro.

Para ejecutarlo:
# ./Script /directorio_a_respaldar /directorio_donde_guardar_el_respaldo


#!/bin/bash
# Script para automatizar respaldos (Backups)
### INICIALIZACION DE VARIABLES ####
FECHA_ACTUAL=`date +%d-%m-%Y`               # Fecha actual con formato dd-mm-YYYY (ejem: 15-08-2008)
NOMBRE_ARCHIVO=`basename $1`[$FECHA_ACTUAL] # Nombre del archivo resultante del respaldo (ejem: Documentos[15-08-2008].tar.gz)
### CUERPO DEL SCRIPT ###
clear
# Comprovar si tiene permisos de root
if [ $UID -ne 0 ]; then
echo "Para poder realizar el respaldo necesita tener permisos de superusuario."
exit
# Comprovar si se ha pasado como parametro el directorio/archivo a respaldar
elif [ $# -ne 1 ]; then
echo
echo "Modo de uso: ./`basename $0` {diretorio_a_respaldar} {directorio_donde_respaldar}"
echo
exit
# Comprovando permisos de escritura
elif [ -w $2 ]; then
# Inicio del log
echo "LOG DEL BACKUP DEL DIA `date +%d/%m/%Y`" >> $2/$NOMBRE_ARCHIVO.log
echo "Hora de inicio de backup: `date +%H:%M:%S`" >> $2/$NOMBRE_ARCHIVO.log
# Inicio del respaldo
tar -czvf $2/$NOMBRE_ARCHIVO.tar.gz $1 >> $2/$NOMBRE_ARCHIVO.log 2>> $2/$NOMBRE_ARCHIVO-erros.log
# Fin del respaldo
# Crear md5
md5sum $2/$NOMBRE_ARCHIVO.tar.gz >> $2/$NOMBRE_ARCHIVO-md5.txt
# Finalizacion del log
echo "Hora de termino del backup: `date +%H:%M:%S`" >> $2/$NOMBRE_ARCHIVO.log
echo "El respaldo de $1 y todos sus contenidos en $2 ha finalizado con exito."
else
echo
echo "No tiene permiso de escritura en $2"
fi
### FIN DEL SCRIPT ###

No hay comentarios: