Puede utilizar launchd
.
launchd
le permite gestionar demonios y agentes de acuerdo con ciertas condiciones.
¿Qué son los demonios y los agentes?
En man launchd
:
Un "demonio" es, por definición, un servicio para todo el sistema del que hay una instancia para todos los clientes. Un "agente" de "agente" es un servicio que se ejecuta por usuario. Los demonios no deben intentar mostrar la interfaz de usuario o interactuar directamente con la sesión de inicio de sesión de un usuario. de un usuario. Todo el trabajo que implique interactuar con un usuario debe realizarse a través de agentes.
En http://developer.apple.com/library/mac/#technotes/tn2083/_index.html :
Daemons y agentes, conocidos colectivamente como bac programas que operan sin interfaz gráfica de usuario. [ ] desarrollador, puede utilizar programas en segundo plano para realizar acciones sin interacción del usuario, y también para gestionar un estado compartido entre múltiples otros programas.
La diferencia entre un agente y un daem mostrar GUI si quiere, mientras que un daemon no puede. La diferencia entre un agente y una aplicación normal es que un agente típicamente no muestra GUI (o una GUI muy limitada).
El demonio/agente se describe en un archivo XML con extensión plist. Una de las condiciones que se pueden controlar es cambios en una carpeta . Esto será muy útil.
Bien, ensuciémonos las manos:
Digamos que estas son las 2 carpetas donde tú y tu amigo guardáis vuestros archivos:
/tmp/folderstuart
/tmp/folderstuartsfriend
y esta es la carpeta común para la aplicación:
/tmp/folder
Queremos supervisar las dos rutas anteriores y sincronizar su contenido con /tmp/folder
.
Este es el plist que hace lo que necesitamos:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>Label</key>
<string>notesfoldersync</string>
<key>ProgramArguments</key>
<array>
<string>/usr/bin/rsync</string>
<string>-aE</string>
<string>--delete</string>
<string>--exclude='.*'</string>
<string>/tmp/folderstuart/</string>
<string>/tmp/folderstuartsfriend/</string>
<string>/tmp/folder</string>
</array>
<key>WatchPaths</key>
<array>
<string>/tmp/folderstuart</string>
<string>/tmp/folderstuartsfriend</string>
</array>
<key>ThrottleInterval</key>
<integer>10</integer>
</dict>
</plist>
El plist controla las dos carpetas con clave WatchPaths
(véase http://developer.apple.com/library/mac/#documentation/MacOSX/Conceptual/BPSystemStartup/Chapters/CreatingLaunchdJobs.html#//apple_ref/doc/uid/10000172i-SW7-SW8 ).
Sugiero el programa rsync
para sincronizar carpetas. Opción --delete
garantiza que los archivos eliminados en las carpetas supervisadas también se eliminen en /tmp/folder
. Otras opciones son -aE
para copiar atributos HFS+ estándar y extendidos, y --exclude='.*'
saltar .localized
, .DS_Store
y otros archivos ocultos.
He añadido ThrottleInterval
en caso de que desee establecer el intervalo mínimo en el que se puede generar un trabajo. El valor predeterminado es 10 s, es decir, los trabajos no se generarán más de una vez cada 10 segundos.
Guarde el plist (véase man launchd
para obtener una lista de posibles rutas) como:
/System/Library/LaunchDaemons/notesfoldersync.plist
Crear:
/tmp/folderstuart
/tmp/folderstuartsfriend
/tmp/folder
y cargar (es decir, habilitar) el plist:
sudo launchctl load /System/Library/LaunchDaemons/notesfoldersync.plist
Ahora cree un archivo en /tmp/folderstuart
:
touch /tmp/folderstuart/file.txt
y observa cómo se produce la magia: file.txt
se creará en cuestión de segundos en /tmp/folder
. Elimínelo y desaparecerá de /tmp/folder
. También sincronizará los archivos creados o eliminados en /tmp/folderstuartsfriend
.
Observa que esta solución no gestiona las colisiones de nombres. Si no puede asegurar que los archivos se nombrarán de forma diferente sustituya rsync por un script que rsyncs y comprueba el nombre de los archivos para evitar la pérdida de datos.
Si copiar archivos no es una opción, sustitúyalo por rsync
con un script que crea hardlinks (si ambos archivos están en el mismo sistema de archivos yo recomendaría hardlinks en lugar de symlinks). Antes de cambiar el plist descargalo:
sudo launchctl unload /System/Library/LaunchDaemons/notesfoldersync.plist
Cuando termines, vuelve a cargarlo.