Potresti usare launchd
.
launchd
ti consente di gestire daemon e agenti in base a determinate condizioni.
Che cosa sono i demoni e gli agenti?
Da man launchd
:
A "daemon" is, by definition, a system-wide service of which there is
one instance for all clients. An
"agent" is a service that runs on a per-user basis. Daemons should not attempt to display UI or interact directly with a user's
login session. Any and all work that involves interacting with a user should be done through agents.
Da link :
Daemons and agents, collectively known as background programs, are
programs that operate without any graphical user interface. As a
developer, you can use background programs to perform actions without
user interaction, and also to manage a shared state between multiple
other programs.
The difference between an agent and a daemon is that an agent can
display GUI if it wants to, while a daemon can't. The difference
between an agent and a regular application is that an agent typically
displays no GUI (or a very limited GUI).
Il daemon / agente è descritto in un file XML con estensione plist. Una delle condizioni che è possibile monitorare è modifiche in una cartella . Questo sarà utile.
OK, sporcarci le mani:
Diciamo che queste sono le 2 cartelle in cui tu e il tuo amico tenete i vostri file:
/tmp/folderstuart
/tmp/folderstuartsfriend
e questa è la cartella comune per l'applicazione:
/tmp/folder
Vogliamo monitorare i due percorsi sopra e sincronizzare i loro contenuti con /tmp/folder
.
Questo è il plist che fa ciò di cui abbiamo bisogno:
<?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>
Il plist controlla le due cartelle con la chiave WatchPaths
(vedi link ).
Suggerisco il programma rsync
per sincronizzare le cartelle. L'opzione --delete
garantisce che anche i file eliminati nelle cartelle monitorate vengano eliminati in /tmp/folder
. Altre opzioni sono -aE
per copiare gli attributi HFS + standard ed estesi e --exclude='.*'
per saltare .localized
, .DS_Store
e altri file nascosti.
Ho aggiunto ThrottleInterval
nel caso in cui desideri impostare l'intervallo minimo in cui un lavoro può essere generato. Il valore predefinito è 10 s, ovvero i lavori non verranno generati più di una volta ogni 10 secondi.
Salva il plist (vedi man launchd
per un elenco di percorsi possibili) come:
/System/Library/LaunchDaemons/notesfoldersync.plist
Crea:
/tmp/folderstuart
/tmp/folderstuartsfriend
/tmp/folder
e carica (cioè abilita) il plist:
sudo launchctl load /System/Library/LaunchDaemons/notesfoldersync.plist
Ora crea un file in /tmp/folderstuart
:
touch /tmp/folderstuart/file.txt
e osserva la magia che si verifica: file.txt
verrà creato in pochi secondi in /tmp/folder
. Eliminalo e scomparirà da /tmp/folder
. Sincronizza anche i file creati o eliminati in /tmp/folderstuartsfriend
.
Si noti che questa soluzione non gestisce le collisioni di nomi! Se non è possibile garantire che i file vengano denominati in modo diverso, sostituisci rsync con uno script che rsyncs e esegue il file controllo del nome per evitare la perdita di dati.
Se copiare i file non è un'opzione, sostituisci rsync
con uno script che crea i collegamenti fisici (se entrambi i file si trovano nello stesso file system, consiglierei i collegamenti fisici anziché i collegamenti simbolici). Prima di cambiare il plist, scaricalo:
sudo launchctl unload /System/Library/LaunchDaemons/notesfoldersync.plist
Al termine, caricalo di nuovo.