<body>

Sitios web relacionados: PingBlog | Fotos

sábado, octubre 22, 2005

Echando código: ¿Como hacer un respaldo de una carpeta, todos los Viernes?

Tux
Un pana me preguntó lo siguiente:
Hola José,

pana tengo una inquietud por resolver y es la
siguiente;

Necesito hacer un backup semanal (todos los viernes)
de una carpeta que está en mi servidor
(/var/www/documentos) comprimirlo a gzip y enviar una
confirmación por email de que se hizo correctamente el
backup, lo he hecho en PHP pero me toca pedalearlo
para que se ejecute y no es el ideal porque no es del
todo automatizado.

He visto este
(http://members.lycos.co.uk/wipe_out/automysqlbackup/)
pero es para hacer un mysqldump de una base de datos.
Le he configurado y le he puesto en /etc/cron.daily a
correr y funciona al pelo.

No recuerdo si tu habias hecho algo parecido en perl
en el antiguo blog del angel negro (busqué pero
encontre).

Será que tienes ese script? o si no es mucha molestia
puedes dedicar un post para hacer un backup
automatizado de carpetas?
La respuesta aqui no es un script, sino un poquitico de UNIX; Lo único que necesitamos es hacer el respaldo y luego nos mandamos el contenido de el mismo por correo, sólo si este fué exitoso:

0 0 * * 5 /bin/tar -cf - /var/www/documentos | /usr/bin/gzip -c > /dirrespaldo/backup.tar.gz && /usr/bin/gunzip -c /dirrespaldo/backup.tar.gz | /bin/tar -tvf - | /bin/mail -s 'Backup realizado con exito' midirecciondecorreo@example.com

Para facilitarles las cosas, diferencié con colores las secciones de el truco: verde para cron, rojo para el respaldo y azul para el correo electrónico.

El dia que no recibas el correo entonces sabes que algo salió mal :). Otra cosa: como pueden darse cuenta esta es una de las tareas para las que PHP no fué hecho ;)

Para aquellos interesados, un script un poco más complejo está aqui.

Buscar en Technorati:

9 Comentarios:

Blogger jcamargo dijo que...

Gracias josé!

Como dices PHP (o Pura Habladera de Paja según tu jeje) no está hecho para esta clase de tareas.

Por ahi estoy probando con ruby haber si mejorarmos y salimos de ese PHP :o)

Saludos desde Bogotá

Jorge.

11:15 PM (enlace permanente)  
Blogger bureado dijo que...

tar puede comprimir con GNU zip o con bzip2 automáticamente. No es necesario usar los enlaces de bash para esto. Por otra parte, estás usando la tubería de forma incorrecta. Deberías usar && ó ;. Además tar preferentemente no admite opciones precedidas de un guión. La línea correcta es tar cvzf backup.tar.gz /var/www/documentos && tar tvzf backup.tar.gz && mail -s "Backup Realizado con Éxito" correo@example.com
PHP puede ser compilado como un CGI y ser usado para tareas de scripting. Sin embargo, PHP no solamente no sirve para scripting, sino que su uso para aplicaciones Web es dudoso.

6:29 PM (enlace permanente)  
Blogger KodeGeek dijo que...

Hola Bureado,

Eres muy categorico en tus comentarios y debo decir que:

1. El tar de Sun o de Solaris NO puede utilizar a gzip o bzip2. Por eso es preferible ser explicito al decidir que compresor utilizar.
2. ¿No sabes la diferencia entre '&&' y ';'? En el ejemplo yo utilizo && porque si ttar falla entonces el correo no será enviado. Veo que no fué obvio (por otro lado ';' se utiliza solamente para separar comandos, sin importar si lograron ejecutarse exitosamente o no.
3. Lo de tar no utilizando guiones precedidas de guión es pura paja. Prueba mi linea de comandos y verás que funciona SIN problemas (no sé de donde sacaste esa información pero está completamente equivocada).
4. ¿PHP usado para tareas como scripting? Ese es el problema de tener sólo un martillo como herramienta, ya que todos los demás problemas se "ven como clavos". ¿Porqué usar una aplicación como PHP para hacer este tipo de cosas cuando tienes Bash, Perl, Python, Ruby y otros Scripting Languajes?

Espero esto aclare tus dudas.

JV,

7:16 PM (enlace permanente)  
Anonymous Anónimo dijo que...

no es mucho mas facil usar rsync/grep/mail?

2:52 PM (enlace permanente)  
Blogger KodeGeek dijo que...

Anonimo:

Rsync no deja comprimidos los archivos finales, si piensas buscar errores con grep (no se me ocurre otra cosa) puede resultar bastante impreciso (¿expresiones regulares con egrep?).

Además (otra ventaja adicional) si nuestro amigo se decide en el futuro a untilizat una unidad de cinta entonces sólo tiene que hacer:

tar -cf /dev/nst0 (en vez de un archivo).

Ahora si de copiar los archivos se trata y no te importa conservar el propietario entonces nada la gana a cp (copy) :D

¿Fué eso lo que quisiste decir?

JV.

9:56 PM (enlace permanente)  
Blogger bureado dijo que...

Dije "preferentemente no admite", etc. como se puede ver fácilmente en el manual, el guión está entre corchetes lo cual indica que es un soporte legacy. Me remito a listas de correos como por ejemplo: "Busybox is not broken -- it just doesn't support the tar legacy options without a leading dash and (args are parsed POSIX compliant)" Conozco la diferencia entre && y ;. Lo que me extraña es que hayas usado _tuberías_. Fíjate que en mi solución, yo usé &&, justo lo que tu dices que usaste y no usaste :) No utilizo PHP, yo utilizo bash y Perl. Me duele llamar Perl, Ruby y Python lenguajes de scripting. Son lenguajes de propósito general, y hasta donde sé, altamente tipados segun el paradigma imperativo. Rsync es otro problema, implica tener más servicios y más complejidad en una solución que inicialmente es como la que propuso José.

12:58 AM (enlace permanente)  
Blogger bureado dijo que...

Con respecto al tar de Solaris, puedo leer una pagina de manual (http://www.uwsg.iu.edu/usail/man/solaris/tar.1.html) donde no veo los leading dashes. En todo caso, eso de no soportar gzip ó bzip2 es muy 1970's! Esperemos que en OpenSolaris Sun decida evolucionar según el modelo Darwiniano. Saludos.

1:00 AM (enlace permanente)  
Blogger bureado dijo que...

Agregando: Utilizaste el enlace lógico AND de bash (&&) entre el gzip y el gunzip (demasiado enredo, porque hay que hacer todo en tantos comandos?!) lo cual dice: "Si falla comprimiendo" y no: "Si falla respaldando".

Espero esto aclare tus dudas.

1:43 PM (enlace permanente)  
Blogger KodeGeek dijo que...

Bureado:

El uso de tuberias es estandar en UNIX y en este caso.

Por otro lado (y para dejar matar esta cobversacion de semantica de una buena vez) si sabe que tienes GNU tar y GZIP o BZIP entonces se pueden colocar los parametros

Ahh, y en cuanto a si Perl, Python y Rubyt son lenguajes de scripting, si lo son pues no son compilados ni siquiera en Bytecode (que sean mas poderosos que Bash o Sed o AWK es otra cosa). Ademas otro requisito para que sean scripts es que no te obligan a declarar tipos de datos para tus variables (aunque el lenguaje internamente sepa que tipo de dato es).

Finalmente (en el ejemplo) un fallo en la compresion se puede interpretar como un fallo en el respaldo (por el hecho de usar una tuberia).

Avisame si necesitas mas informacion :)

7:04 PM (enlace permanente)  

Publicar un comentario en la entrada

Enlaces a este articulo:

Crear un vínculo

<< Regresar