Sync Data to a Remote Host using lsyncd

Based on rsync, lsyncd is a demonised implementation that monitors for file modifications, and triggers a synchronisation if detected.

Here I am using Ubuntu 18.04 at both ends but the process should pretty much be the same regardless with platform you’re using.

Here we are going to monitor for changes to files on a server called repo, and push when changes are detected to a server called mirror. The master server, repo, will need lsyncd installed and be able to SSH to mirror without a password.

On the master server, install lsyncd. On Ubuntu, this would be:

[email protected]:~# apt update -y && apt install lsyncd

You can check the version with:

[email protected]:~# lsyncd --version
Version: 2.1.6

To setup passwordless authentication – you’ll need a public/private key-pair. If you don’t already have one, you can create one using the ssh-keygen command. Accept all the default answers.

[email protected]:~# ssh-keygen

You can now copy the public key (~/.ssh/ to the remote host using the ssh-copy-id command:

[email protected]:~# ssh-copy-id [email protected] -p22

Check you can now SSH into the remote host without a password.

[email protected]:~# ssh [email protected]

Then you’ll need to create the following directory and configuration file.

[email protected]:~# mkdir -v /etc/lsyncd
mkdir: created directory '/etc/lsyncd'
[email protected]:~# vim /etc/lsyncd/lsyncd.conf.lua

Here I’m going to create a demo directory of data I want to monitor for changes.

[email protected]:~# mkdir -v test-lsyncd-source
mkdir: created directory 'test-lsyncd-source'

And on the remote host, I created the following directory that data will be synchronised to.

[email protected]:~# mkdir -v /srv/repositories/mirror
mkdir: created directory '/srv/repositories/mirror'

Create something like below:

settings {
  logfile = "/var/log/lsyncd/lsyncd.log",
  statusFile = "/var/log/lsyncd/lsyncd.status",
  statusInterval = 20,
  nodaemon   = false

sync {
  source = "/root/test-lsyncd-source/",
  host = "",
  targetdir = "/srv/repositories/mirror/",
  rsync = {
    owner = true,
    group = true,
    perms = true

Before restarting the lsyncd service, you will first need to create the log directory it would seem.

[email protected]:~/test-lsyncd-source# mkdir -v /var/log/lsyncd
mkdir: created directory '/var/log/lsyncd'

Then restart the lsyncd service.

[email protected]:~/test-lsyncd-source# systemctl restart lsyncd

Start creating some files and check it syncs as expected.

[email protected]:~/test-lsyncd-source# ls -il
total 4
4387318 lrwxrwxrwx 1 root  root    10 Apr  7 13:52 data2 -> dir1/dir2/
4387319 lrwxrwxrwx 1 root  root    10 Apr  7 13:52 data3 -> dir1/dir3/
4387308 drwxr-xr-x 4 root  root  4096 Apr  7 13:48 dir1
4387306 -rw-r--r-- 1 andy andy    0 Apr  6 16:13 file2.txt
4387237 -rw-r--r-- 1 root  root     0 Apr  6 15:40 test.txt

You can check the status by tailing the following file.

[email protected]:~/test-lsyncd-source# fail -f /var/log/lsyncd/lsyncd.status
Lsyncd status report at Wed Apr  7 13:52:29 2021

Sync1 source=/root/test-lsyncd-source/
There are 0 delays

Inotify watching 4 directories
  1: /root/test-lsyncd-source/
  5: /root/test-lsyncd-source/dir1/dir2/
  6: /root/test-lsyncd-source/dir1/dir3/
  4: /root/test-lsyncd-source/dir1/

And by tailing the log file.

[email protected]:~/test-lsyncd-source# tail -f /var/log/lsyncd/lsyncd.log 
Wed Apr  7 13:49:52 2021 Normal: Finished (list): 0
Wed Apr  7 13:50:14 2021 Normal: Rsyncing list
Wed Apr  7 13:50:15 2021 Normal: Finished (list): 0
Wed Apr  7 13:52:24 2021 Normal: Rsyncing list
Wed Apr  7 13:52:25 2021 Normal: Finished (list): 0

You may also want to check at this point that lsyncd is set to start at boot-up.

[email protected]:~# systemctl enable lsyncd.service

And that’s about it!

Be the first to comment

Leave a Reply