20

I can sync folders with rsync -avz /directory /target, now I wish to do it if I changed a file in /directory so rsync should be called automatically.

I am using Virtual Box and the shared folder of Virtual Box is really slow, especially if you have a webpage which is using the shared folder as document root. With rsync i would be able to work with my local files on shared folder and sync it automatically with document root.

I hope someone has an idea how to do so,crontab would be not good, because it is executed each x minutes, so if i don't do anything, it will still call rsync but not if I modified my file.

Best regards

20

crontab would be not good, cause it is executed each x seconds/minutes, so if i dont do anything, it will still call rsync but not if i modified my file

rsync will only sync the files that have been changed. If nothing has changed, it will exit. That's really a minimal overhead.

If you're unhappy with that you could use inotifywait:

while inotifywait -r /directory/*; do
    rsync -avz /directory /target
done

That will be more instant but it will do things every time you save.

6
  • 1
    well the problem it seems, that inotify is not able to check shared nfs folders. to make sure, what i want to,tryin to describe i have virtual box installed with vagrant, there i have a shared folder "projects" it is mounted on boot, all my webserver files are located there so i can modify them on my host system(win7) as i told virtual box shared folders are really slow, so solution could be to sync the mounted nfs folder to another place e.g /var/www but the common ways are not working, i tryed fileschanged, icrontab, gues gamin or fam would help, but i dont know how to start or use them
    – BlackScorp
    Aug 30 '13 at 10:55
  • @BlackScorp realistically you're stuck with just cronning rsync and letting it decide what needs syncing. As I lead with in the answer, that's not an awful bad option.
    – Oli
    Aug 30 '13 at 13:15
  • 1
    The other option is to push the files from the host rather than trying to detect changes remotely.
    – Oli
    Aug 30 '13 at 13:16
  • well this solution i used before, it has 2 problems: 1) i had to reconect everytime to my virtual box to edit files, which means, my virtual must running, quick editing is not working anymore 2) i dont know why, but because of the project scanning process of my IDE(Netbeans) samba shows 99% CPU Usage and everything within the virtual box is just slow while developing i will try the rsyn + cronjob solution or the php build in webserver
    – BlackScorp
    Oct 22 '13 at 6:29
  • The inotifywait solution has one slight but important drawback: it does not detect changes which happened when rsync is running. Consider the following situation: file A is changed; rsync is triggered; when rsync is almost done synchronizing file A, file B is changed. Now, rsync finished and inotifywait is running, but file B is not synchronized and won't be synchronized until some next change. Consider using lsyncd as suggested by @Arigion.
    – MarSoft
    Jul 25 '19 at 13:54
7

You could use Lsyncd (Live Syncing Daemon):

Lsyncd watches a local directory trees event monitor interface (inotify or fsevents). It aggregates and combines events for a few seconds and then spawns one (or more) process(es) to synchronize the changes. By default this is rsync. Lsyncd is thus a light-weight live mirror solution that is comparatively easy to install not requiring new filesystems or block devices and does not hamper local filesystem performance.

Here is for example a tutorial for Ubuntu 16.04.

4

You can use inotifywait and rsync. inotifywait with the event modify,create,delete enabled. This way you will synchronize with your server only when the file changes, otherwise it will sync whenever a file is read (editors read several times your file to check if there are any changes). Thus said:

while inotifywait -r -e modify,create,delete /directory; do
    rsync -avz /directory /target
done
2
  • This won't detect changes happened while rsync is running. Consider using lsyncd as suggested by @Arigion.
    – MarSoft
    Jul 25 '19 at 14:00
  • this will re-apply all events on all files after each change... and when it's applying it won't see any change in that period...
    – Somebody
    Nov 27 '19 at 10:19
0

Expanding slightly on a comment to the accepted answer I've had success using fswatch to trigger an scp of changed files to the guest. On Linux this is a wrapper around inotify but it's also cross-platform (I'm on a Mac with an Arm-based QEMU guest). I've tacked on an ssh remote build as well. The push approach works well with shares that behave in less than ideal ways.

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service, privacy policy and cookie policy

Not the answer you're looking for? Browse other questions tagged or ask your own question.