Automatizando backups en Mac OS X

por davidgp el 28/12/2006

Hasta el momento mi forma de hacer backups en Mac OS X era usando un par de scripts en Bash y empleando como utilidad principal rsync. Dichos scripts funcionan a la perfección, salvo por un detalle, los tengo que ejecutar manualmente cada vez que quiero hacer un backup. Pensé en automatizar el proceso usando algo como Cron, pero la verdad, nunca sé a que hora del día va estar encendido mi portátil para hacer eso de forma automática. La solución ideal sería que cada vez que enchufase mi disco externo, el backup se hiciese de forma automática.

A través de TUAW llegué al siguiente manual de MacResearch, el cual resumo un poquito aquí en castellano.

La idea consiste en usar LaunchD, un demonio de Unix creado por Apple para substituir a demonios típicos de Unix encargados de lanzar procesos. En nuestro caso, vamos a añadir una directiva de LaunchD a nivel de usuario y un pequeño script hecho en Bash.

Lo primero que necesitamos es crear un par de directorios usando el Terminal:

 cd ~/Library/ mkdir LaunchAgents 

Ya que estamos, también creamos un directorio llamado Scripts en el mismo sitio

 mkdir Scripts 

Dentro del directorio LaunhAgents, estarán los ficheros de configuración que LaunchD cargará cada vez que hagamos login. Dichos ficheros estarán en formato PList.

Tengo que confesar que no soy un experto en el formato en que se escriben dichos ficheros, y tampoco en la potencia que pueden desarrollar, pero el caso que tenemos que explicar aquí es bastante sencillo. Lo primero que hacemos es crear nuestro pequeño fichero de configuración dentro de ~/Library/LaunchAgents

 touch com.davidgp.backup open -e com.davidgp.backup 

Y dentro de ese fichero podemos algo parecido a lo siguiente

 <?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE plist PUBLIC "-//Apple Computer//DTD PLIST 1.0//EN" \ "http://www.apple.com/DTDs/PropertyList-1.0.dtd"> <plist> <dict>         <key>Label</key>         <string>com.davidgp.backup</string>         <key>LowPriorityIO</key>         <true/>         <key>Program</key>         <string>/Users/davidgarciaperez/Library/Scripts/backup.com</string>         <key>ProgramArguments</key>         <array>                 <string>backup.com</string>         </array>         <key>WatchPaths</key>         <array>         <string>/Volumes</string>         </array> </dict> </plist> 

Hay cosas bastante interesantes en este fichero, después de las cabeceras típicas de todo fichero XML, tenemos el siguiente código

         <key>Label</key>         <string>com.davidgp.backup</string> 

Esto nos esta definiendo un identificador único que usará LaunchD cuando cargue este fichero PList, es interesante hacer este texto descriptivo, para saber que hace este fichero nada más leerlo. El siguiente par de líneas

         <key>LowPriorityIO</key>         <true/> 

Esta directiva indica a Mac OS X que nuestra tarea tiene poca prioridad con respecto a cualquier otra actividad que se realice en los discos duros en ese momento. La idea es que mientras que hacemos el backup en segundo plano, no notemos la falta de rendimiento en nuestro equipo. Esta opción es opcional.

         <key>Program</key>         <string>/Users/davidgarciaperez/Library/Scripts/backup.com</string> 

Estas líneas indican que programa se ejecutará cuando ocurra el evento que estemos monitorizando.

         <key>ProgramArguments</key>         <array>                 <string>backup.com</string>         </array> 

Estos son los argumentos que le pasamos al programa, en mi caso, y con el script que cree no se le pasan ninguno, aún así, hay que volver a indicar el nombre del programa como primer argumento.

         <key>WatchPaths</key>         <array>         <string>/Volumes</string>         </array> 

Y por último las líneas más importantes para que nuestro script de backup funcione. La directiva WatchPath lanzará el script que tenemos especificado, backup.com, cada vez que el directorio /Volumes cambie. /Volumes es una carpeta del Mac OS X donde se montan todas las unidades de disco conectadas en ese momento. Cada vez que conectemos un disco duro usb, firewire... aparecerá en dicha carpeta.

Ahora llega el turno al script, en MacResearch lo escriben en tcsh, yo como estoy más acostumbrado a bash, he optado por esta última opción. En un terminal ejecutamos lo siguiente, dentro del directorio ~/Library/Scripts

 touch backup.com chmod 755 backup.com open -e backup.com 

Y aquí esta mi script en bash:

 #!/bin/bash  # Variables que especifican donde se hace cada cosa  directorio2Backup="/Users/davidgarciaperez/trabajo/" backupVolume="/Volumes/LaCie Disk" directorioBackup="/Volumes/LaCie Disk/backup/trabajo/"  # Tiempo de espera que le damos al sistema para que monte todo # correctamente  sleep 30  # Este if comprueba si estamos a–adiendo el disco donde queremos hacer el # backup # Si el test pasa, se hace el backup usando rsync  if [ -e "$backupVolume" ]  then  rsync -aq --delete "$directorio2Backup" "$directorioBackup" fi  exit 0 

El script es bastante autoexplicativo. Como único detalle fijarse en que le damos tiempo al sistema a que monte correctamente el disco duro, spleep 30, antes de hacer nada, en mi Macbook Pro, esos 30 segundos son más que suficientes. También tendréis que cambiar el nombre del volumen al correcto en vuestro caso. "LaCie Disk" es el nombre de mi disco duro externo. Si, lo sé, soy demasiado vago como para cambiarlo a algo más original.

Por último, si queremos probar el script, tenemos que hacer que LaunchD note su presencia, para ello simplemente ejecutamos lo siguiente en un Terminal.

 launchctl load ~/Library/LaunchAgents 

Para comprobar que todo ha sido cargado correctamente

 launchctl list 

Y deberías obtener algo parecido a esto

 Voyager:~/Library/Scripts davidgarciaperez$ launchctl list com.davidgp.backup 

Ahora simplemente tenéis que enchufar vuestro disco duro y ver si se realiza el backup. Puede que parezca muy complicado, pero yo que estoy algo acostumbrado a los scripts en Unix, me pareció bastante sencillo ;-).

-----

{ 1 comentario… read it below or add one }

werutzb 08/10/2008 a las 4:25 am

Hi!

I want to make better my SQL experience.
I red so many SQL books and want to
get more about SQL for my occupation as oracle database manager.

What can you recommend?

Thanks,
Werutz

Leave a Comment

Entrada anterior:

Entrada siguiente