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