Linux: Continuously synchronize files, one way

172

Solution 1

You can also use inotifywait from the inotify-tools package.

inotifywait -r -m -e close_write --format '%w%f' /tmp | while read MODFILE
do
    echo need to rsync $MODFILE ...
done

Solution 2

Lsyncd would be a good solution for this.

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 blockdevices and does not hamper local filesystem performance.

Bottom-line, it uses the same kind of tools to do the job (inotify and rsync) as suggested by other answers, but it's easier to set up for someone not familiar with shell scripting.

Solution 3

I need this a lot since my code needs to run on remote boxes and I write code on local machine. I found a nice tool which you can use to continuously monitor your local folders and sync them to remote or local folder: https://github.com/axkibe/lsyncd

A simple command to continuously sync a local dir with remote machine over ssh will be:

lsyncd -log all -nodaemon -rsyncssh <local_path> <user>@<ip> <remote_path>

Just like with any other rsync command, make sure you give the folder path right and check before you run the command. I almost had killed one of my remote machine because I missed to give a correct destination directory. Make sure yo don't miss out the remote path and don't use '/' unless you know what you are doing.

Solution 4

If you need to observe filesystem, then inotify is the way to do it. I would write a simple python script using pyinotify to perform sync when filesystem get changed. See documentation. You might also checkout the autosync.py for some inspiration. Have fun.

Solution 5

What I did once is have a bash script running ls -l in a loop (with some sleep) and comparing to the previous output. If it changed, do your synchronization.

#!/bin/bash

listcommand="ls -l $*"

newfilelist=$( $listcommand )
while true
do
   if [[ $oldfilelist != $newfilelist ]]
   then
      oldfilelist=$newfilelist
      # run your synchronization tool
   fi
   sleep 10 || exit 2 
   newfilelist=$( $listcommand )
done

Start this script in a new terminal with the file names as arguments (after putting in your synchronization tool).

(I used this to start a compilation, not to synchronize, but this would work a similar way.)

Share:
172

Related videos on Youtube

stolsvik
Author by

stolsvik

Updated on September 18, 2022

Comments

  • stolsvik
    stolsvik over 1 year

    I've been fooling around with generic methods lately and came across methods that look like this:

    public static void Requires<TException>(bool condition, string message) where TException : Exception
    

    To my understanding, when using the above method you provide a Type that inherits from Exception and if the condition is false the provided Exception type is thrown.

    How does this work under the hood?
    Is the TException instantiated like so throw new TException();?
    And how can you pass in the message parameter if the Type is unknown to the method (all it knows is that it inherits type Exception)?

    • Aniruddh Chandratre
      Aniruddh Chandratre almost 13 years
      consider using the rsync tool, or sharing a folder in the webserver's document root so you could operate on the files directly under windows
    • stolsvik
      stolsvik almost 13 years
      rsync is "one go". I need continous updates, that is the entire point here - I edit a file, save it, and the product/system/idea I request would pick this save-action up and upload the new version immediately. NB: Both sides are Linux. NB2: I want to edit on local files, or else sshfs itself would cut it.
    • Karl Bielefeldt
      Karl Bielefeldt almost 13 years
      Off-topic voters, this is a boundary case, but I think it falls fairly clearly under "tools commonly used by programmers" in the FAQ.
    • Panagiotis Kanavos
      Panagiotis Kanavos almost 9 years
      Is this Code Contracts code? In this case Requires means more than simply checking a condition and throwing an exception
    • Admin
      Admin almost 9 years
      @PanagiotisKanavos I saw it in Code Contracts yes. I'm not so much interested in what it does, I'm more interested in how one would take the generic type, create a new instance of it, and then use it.
    • Panagiotis Kanavos
      Panagiotis Kanavos almost 9 years
      If the method has the where T:new constraint, you simply call new T(). Code Contracts methods probably have this constraint as well, or use specialized versions for eg. argument exceptions. The source code is available in Github
    • phs
      phs almost 8 years
      While it's not a perfect match, you might look at overlayfs
  • Karl Bielefeldt
    Karl Bielefeldt almost 13 years
    On the inotify-tools website, there's a pretty good example of using inotify-wait to trigger an rsync.
  • CenterOrbit
    CenterOrbit almost 13 years
    I was looking for this exact thing last night! ahhh I love superuser
  • stolsvik
    stolsvik almost 13 years
    Thanks for answering. However, I specifically excluded this very approach in the question.
  • Ciantic
    Ciantic over 10 years
    not only easier, it also tries to handle situations like moving directory properly, without rsyncing.
  • Admin
    Admin almost 9 years
    Sure, I'm with you so far. But what if I needed to make a new instance of that Type in a method I make myself?
  • Panagiotis Kanavos
    Panagiotis Kanavos almost 9 years
    If the type has the new constraint, you can simply call new TException()
  • NeddySpaghetti
    NeddySpaghetti almost 9 years
    You can use default(Type) or if you have a new() constraint you can use new Type().
  • Flash
    Flash almost 7 years
    Is there a way to do this but keep the socket open? rsync/scp has an annoying delay while establishing the ssh connection.
  • Friedrich
    Friedrich over 6 years
    Beware: This program has some problematic features. As of writing this: 1. It deletes remote files not present at the source per default. 2. "remote:" refers to "remote:/" instead of the home folder. 3. It daemonizes, so you do not know what is going on. 4. It does not immediately respect the TERM signal.
  • Will Angley
    Will Angley about 6 years
    @Flash yes, you can use SSH multiplexing to keep the socket open.
  • hanshenrik
    hanshenrik about 2 years
    unfortunately this gets me auto firewall IP banned xD
  • Admin
    Admin almost 2 years
    This gets my ip banned under a firewall after sometime.