スポンサーリンク

inotify-tools rsync unison を利用してディレクトリを同期する

スポンサーリンク
CentOS
スポンサーリンク

スポンサーリンク

概要

inotify-tools + rsync or inotify-tools + unison でディレクトリ間をリアルタイムで同期する方法の紹介です。

開発環境へのアップロードなどの場面で役立つでしょう。

環境・バージョン情報等

CentOS6上で検証しています。

inotify-tools

rvoicilas/inotify-tools
inotify-tools is a C library and a set of command-line programs for Linux providing a simple interface to inotify. - rvoicilas/inotify-tools

バージョン情報

  • CentOS6
  • inotify-tools (inotifywait, inotifywatch) 3.14
  • Rsync 3.0.6
  • unison 2.40.63

インストール

inotify-tools

# 必要なモジュール類のインストール
$ yum -y install wget gcc gcc-c++ make
# inotify-toolsのインストール
$ cd /tmp
$ wget http://download-ib01.fedoraproject.org/pub/epel/6/x86_64/Packages/i/inotify-tools-3.14-2.el6.x86_64.rpm
$ yum -y localinstall inotify-tools-3.14-2.el6.x86_64.rpm
inotify-tools-3.14-2.el6.x86_64.rpm CentOS 6 Download
Download inotify-tools-3.14-2.el6.x86_64.rpm for CentOS 6 from EPEL repository.

rsync

$ yum -y install rsync

unison

$ cd /tmp
$ wget http://ftp.tu-chemnitz.de/pub/linux/dag/redhat/el6/en/x86_64/rpmforge/RPMS/unison-2.40.63-1.el6.rf.x86_64.rpm
$ yum -y localinstall unison-2.40.63-1.el6.rf.x86_64.rpm
unison-2.40.63-1.el6.rf.x86_64.rpm CentOS 6 Download
Download unison-2.40.63-1.el6.rf.x86_64.rpm for CentOS 6 from Repoforge (RPMforge) repository.

inotifywait + rsync で同期する

ここで 作業ディレクトリ src1/ と src2/ を同期する方法を考えます。

fswatch + rsync を利用する方法は 例えばsrc1/ ディレクトリでファイルに変更があった場合 src2/ に同期するというものです。

$ inotifywait -m /path/to/src1 | xargs -I{} rsync -r /path/to/src1/ /path/to/src2/

inotifywait の -e オプションで監視するイベントの種類を絞る事ができます。また複数の操作を行うのであれば、whileで回した方が良いと思います。

#!/bin/bash

SRC_PATH=/path/to/src1/
DST_PATH=/path/to/src2/

while inotifywait -e CREATE -e MODIFY -e DELETE $SRC_PATH; do
    rsync -r $SRC_PATH $DST_PATH
    chown www-data:www-data -R $DST_PATH
    chmod 755 -R $DST_PATH
done

次は双方間のディレクトリ同期についてです。
双方間の同期の実現は、rsyncよりunisonの方が向いています。

inotifywait + unison で同期する

次に fswatch + unison を利用して src1/ と src2/ の双方向で同期する方法を紹介します。

unisonの設定

unisonを容易に利用するために設定ファイルを記述します。

~/.unison/sync.prf

# タイムスタンプをコピーする
times = true

# 新しいファイルを優先
prefer = newer

# 同期する対象のルートパスの定義
root=/path/to/src1/
root=/path/to/src2/

# 同期するパスの定義
path=./

同期コマンド

$ inotifywait -m /path/to/src1 /path/to/src2 | xargs -I{} unison -batch sync

参考

https://codeday.me/jp/qa/20190816/1457317.html

[https://qiita.com/stc1988/items/464410382f8425681c20

タイトルとURLをコピーしました