
Después de almacenar grandes cantidades de archivos o logs en un servidor, como en el ejemplo de los reportes con DB2 y Bash Script. Podemos enfrentarnos al problema del espacio en el disco duro. Lo mas común para resolver esto es mover a un servidor de respaldo los archivos, hacer cintas de respaldo o incluso eliminar archivos con una fecha mayor a n cantidad de tiempo para liberar espacio. Para el primer caso, veamos como hacer un Bash Script que haga un respaldo de los archivos que cuenten con cierta nomenclatura a un servidor remoto con scp.
Para realizar el siguiente ejemplo vamos a necesitar:
- Un usuario/password en ambos servidores
- Un RSA public key en el servidor remoto
- Mas información acerca de administración de usuarios en Linux
El comando básico para hacer la copia usando scp es así:
scp archivo username@remoteserver.com:/path/in/remote/server
Vamos a tomar el ejemplo que hicimos anteriormente de los reportes de DB2 y Bash Script para crear un Script que haga el scp de los archivos al servidor remoto. El código podría empezar de la siguiente forma:
#!/bin/bash
_user="sagara"
_host="backup.tecnolack.com"
_dir="/home/sagara/"
# loop to all files in the current directory
for filename in *; do
case "${filename}*" in
*.sh): echo ".sh files will not be SCP" ;;
reportCandidates2fail*) scp "$filename" ${_user}@${_host}:${_dir} ; rm $filename ;;
*) echo "We are not SCPing this $filename" ;;
esac
done
Log
Recordemos que la nomenclatura que utilizamos para los reportes era así: «reportCandidates2fail_MM_DD_YYYY.txt» (e.g. reportCandidates2fail_06_20_2013.txt). Si tenemos mas de un tipo de nomenclatura de archivos, simplemente agregamos una linea por cada uno con los mismos comandos: report2*) report3*)
Eso sería suficiente para hacer el trabajo, hacer un scp del archivo al servidor remoto y luego borrarlo del servidor local. Aunque podríamos agregar un log al script con algunos eventos para estar seguros que todo funciono bien.
_time=$(date)
_now=$(date +"%m_%d_%Y")
_file="backup_${_now}.log"
scpFile(){
scp "$filename" ${_user}@${_host}:${_dir}
if [ ${PIPESTATUS[0]} -ne 0 ]; then
echo "${_time} : Error while scp $filename" >> ${_file}
else
echo "${_time} : Successful scp $filename" >> ${_file}
#delete file
rm $filename
fi
}
Con la función anterior haremos el scp y revisaremos por medio del $PIPESTATUS, una variable interna del Bash, la cual nos dirá si el primer comando de la instrucción anterior ($PIPESTATUS[0]) fue ejecutado con éxito o no, en este caso el scp. Si el valor no es igual (-ne) a cero entonces es un error y no eliminamos el archivo, imprimimos cual archivo no se pudo copiar al log, un archivo con la nomenclatura backup_MM_DD_YYYY.log.
Y si fue copiado con éxito procedemos a eliminar el archivo original del servidor local.
Versión final
Para terminar agregamos la documentación del script, ademas podemos mandar la notificación por email con el contenido del log o incluso eliminar el archivo según nuestras necesidades.
#!/bin/bash
#
# ################################################
#
# Simple bash script to backup the reports to the
# backup-server
# Usage: sh runBackupReports.sh
# Version: 1.0 Date: 08-July-2013
#
# Contact: sagara@tecnolack.com
#
# ################################################
_user="sagara"
_host="backup.tecnolack.com"
_dir="/home/sagara/"
_time=$(date)
_now=$(date +"%m_%d_%Y")
_file="backup_${_now}.log"
_mailAdmin="sagara@tecnolack.com"
scpFile(){
scp "$filename" ${_user}@${_host}:${_dir}
if [ ${PIPESTATUS[0]} -ne 0 ]; then
echo "${_time} : Error while scp $filename" >> ${_file}
else
echo "${_time} : Successful scp $filename" >> ${_file}
#delete file
rm $filename
fi
}
# loop to all files in the current directory
for filename in *; do
case "${filename}*" in
*.sh): echo ".sh files will not be SCP" ;;
reportCandidates2fail*) scpFile ;;
*) echo "We are not SCPing this $filename" ;;
esac
done
# cat ${_file} | mail -s "SCP BACKUP EVENTS" $_mailAdmin # Enable to send a mail
# rm ${_file} # Enable to delete the log file
Le damos permisos de ejecución y lo ejecutamos:
chmod +x runBackupReports.sh sh runBackupReports.sh


