How to Sync Files in Two-Way Using Osync Script in Linux

You might ask yourself, why do I need a two-way/bidirectional file synchronization solution? The terminal-based nature of osync makes it an ideal file synchronization solution that can be executed in three modes:

  1. manually
  2. via scheduled tasks
  3. via a daemon (triggered when new file changes occur)

This stateful synchronizer acts as a rsync wrapper. Osync is attributed as stateful because it is not obligated to monitor the targeted files for changes. This attribute also makes it agentless.

Between two runs, osync will compare replica file lists. These runs can be local-to-local or local-to-remote. The local-to-local replication run takes approximately 2 seconds whereas the local-to-remote replication run takes approximately 7 seconds.

Osync Features

Prominent Osync feature highlights:

  • Local-to-Local and Local-to-Remote synchronization support.
  • Full script time control.
  • Email alerts
  • Running as a daemon or on schedule
  • Directory monitoring
  • Logging facility
  • Handles multiple sync tasks through the batch runner and failed sync tasks through a rerun option
  • Resume scenarios to handle fault tolerance
  • Extended attributes and POSIX ACL synchronization
  • Command execution for before/after runs
  • Multiple backups and soft deletions handling

If you need speedy execution, you might want to disable some of the osync features like disk space checks and attribute preservation. A target/initiator sync schema is also applicable under osync.

A preexisting target/initiator replica is shielded from multiple concurrent sync processes through pidlocks. Osync’s primary design prevents it from deleting user/system data. Soft deletes or conflictual files are preserved through created backups.

Install Osync in Linux

A stable or latest version of osync can be found on Github. You first need to have git installed before you can retrieve and install the osync file synchronization tool from Github.

Use one of the following installation guides as per your Linux operating system distribution.

Install Osync in RHEL-based Distors

$ sudo yum install git
$ sudo git clone -b "stable"
$ cd osync
$ sudo bash

Install Osync in Debian-based Distors

$ sudo apt install git
$ sudo git clone -b "stable"
$ cd osync
$ sudo bash

Install Osync in Arch Linux

$ sudo pacman -S git
$ sudo git clone -b "stable"
$ cd osync
$ sudo bash

Install Osync in OpenSUSE Linux

$ sudo zypper install git
$ sudo git clone -b "stable"
$ cd osync
$ sudo bash

While cloning osync from Github, removing the -b "stable" option from the git clone command will retrieve osync’s latest dev snapshot.

How to Use Osync in Linux for Two-Way File Synchronization

As already mentioned, there are three approaches to using osync.

  1. Quick Sync Mode
  2. Configuration File Mode
  3. Daemon Mode

Local-Local and Local-Remote File Sync Using Quick Sync Mode

This approach is however convenient for users seeking to achieve fast syncs between directories. For local-to-local directories, consider the following osync syntax:

$ --initiator="/path/to/directory1" --target="/path/to/directory2"

As example implementation is as follows:

$ sudo --initiator="/home/dnyce/LinuxShellTips" –target="/home/dnyce/LinuxShellTips_Backup"
Local-to-Local File Sync
Local-to-Local File Sync

For local-to-remote directories, you might need to first configure your machine for SSH passwordless access.

$ sudo ssh-keygen -t rsa 
$ sudo ssh-copy-id ubuntu@18.118.208.XX
$ sudo ssh ubuntu@18.118.208.XX

The local-to-remote Quick Sync syntax is as follows:

$ --initiator="/path/to/another/directory" --target="ssh://user@host/IP:22//path/to/directory2" 

An example implementation would look like the following:

$ sudo --initiator="/home/dnyce/LinuxShellTips" --target="ssh://ubuntu@18.118.208.XX:22//home/ubuntu/linuxshelltips_remotesync"
Local to Remote File Sync
Local to Remote File Sync

And finally…

Osync Sync Error
Osync Sync Error

Do not worry about osync finished with warnings, It’s just that I disabled pinging on my server. However, your osync command can include the following command options to help you diagnose critical errors.

--summary --errors-only --no-prefix

For example:

$ --initiator="/path/to/another/directory"--target="ssh://user@host/IP:22//path/to/directory2" --summary --errors-only --no-prefix 

Configuring a Cron Job to Automate File Sync

We could automate the Quick Sync mode tasks through cron jobs.

$ sudo su
$ crontab -e

Adding the following two cron jobs for local-to-local and local-to-remote directories will automate our osync tasks.

 */5        *        *        *        * --initiator="/home/dnyce/LinuxShellTips" –target="/home/dnyce/LinuxShellTips_Backup"
 */5        *        *        *        * --initiator="/home/dnyce/LinuxShellTips" --target="ssh://ubuntu@18.118.208.XX:22//home/ubuntu/linuxshelltips_remotesync"

Osync is an ideal two-way synchronization solution for local-to-local and local-to-remote directories. The directory syncs you create are a perfect backup plan for critical data in case of accidental deletion or evidence of corrupt files.

1 thought on “How to Sync Files in Two-Way Using Osync Script in Linux”

Got something to say? Join the discussion.