lsyncd 2.1で特定のファイルのみを同期させる

lsyncdで特定のファイルだけを同期したかったのですが、lsyncdはバージョン2.1未満と2.1以上で使い方が違ってはまったのでその対応メモです。

lsyncdの導入方法はこちら。

バージョン2.1ではrsyncOpsが廃止された

lsyncd 2.0系では、rsyncOpsオプションの–exclude-fromを上手く使うことで、ディレクトリ単位ではなく、特定のファイルのみを同期させることができました。

しかし、このrsyncOpsオプションはlsyncd 2.1で廃止され、代わりにrsyncオプションに名前を変えました。

そのため、従来のrsyncOpsを設定するとlsyncdを起動できず、systemctlのstatusを確認すると以下のようなエラーが表示されます。

$ sudo systemctl status lsyncd
...
 3月 09 03:44:11 Virtual-Machine systemd[1]: Starting LSB: lsyncd daemon init script... 
 3月 09 03:44:11 Virtual-Machine lsyncd[12476]:  * Starting synchronization daemon lsyncd
 3月 09 03:44:11 Virtual-Machine lsyncd[12476]: Error: error preparing /etc/lsyncd/lsyncd.conf.lua: Parameter "rsyncOps" unknown. (if this is not a typo add it to checkgauge)
 3月 09 03:44:11 Virtual-Machine lsyncd[12476]:    ...fail!

参考:

axkibe/lsyncd
Lsyncd (Live Syncing Daemon) synchronizes local directories with remote targets - axkibe/lsyncd

バージョン2.1では代わりに_extraオプションを使う

lsyncd 2.1系ではrsyncオプション内の_extraオプションを使って特定のファイルのみを同期させることができます。

この_extraオプション内に--include--excludeを指定してやることで、同期対象のファイル、同期対象外のファイルを設定することができます。

ですので、以下のように書くとhoge.txtのみが同期され、その他のファイルは同期されなくなり、特定のファイルのみの同期を実現できます。

$ cat /etc/lsyncd/lsyncd.conf.lua
settings {
        logfile    = "/tmp/lsyncd.log",
        statusFile = "/tmp/lsyncd.status"
}
sync {
        default.rsync,
        source    = "/home/user/lsyncd_test/src/",
        target    = "/home/user/lsyncd_test/dst/",
        rsync     = {
          _extra    = {
            "--include=hoge.txt",
            "--exclude=*"
          }
        }
}

参考:

Is it possible to sync just ONE file with lsyncd?
I really am stumped - I've spent almost two hours searching for an answer to a ridiculously simple question: how can I continually keep two local files in sync ...

コメント