lsyncdはlinux上で動くファイルの更新を検知して処理を走らせるデーモンで、これとrsyncを組み合わせればファイルの更新があったときにリモートサーバとファイルを同期できる。
lsyncdとrsyncでぐぐるとrsyncdサーバを立てる記述が目につくけど、sshdが立っていればrsyncdは必要がない。暗号化を行うので若干遅くなるかもしれないけどインターネット越しでも使える。
同期元にはlsyncd, rsync, ssh、同期先にはrsync, sshd、そして同期元から同期先にパスフレーズ無しで入れるようなsshの鍵を設定してあることが必要になる。
lsyncdはyumなどで入る。yumの場合、もしかしたらEPELを設定する必要があるかもしれない。
設定ファイルはLuaで記述する。2.0系と2.1系とでちょっと違っていて、2.1系だとたとえばこんな感じ:
settings { logfile = "/path/to/log", pidfile = "/path/to/pid", statusFile = "/path/to/status", -- 最新の処理結果が書かれる maxProcesses = 2, -- 同時にsyncを走らせる数 nodaemon = false, -- falseだとdaemonになる。デフォルトはtrue insist = 1, -- 起動時に接続に失敗しても再接続を試み続ける } sync { default.rsync, source = "/var/www/html/", -- 監視対象のディレクトリ。rsyncのSRCに相当 target = "example.com:/var/www/html/", -- 同期先のホスト名+ディレクトリ。rsyncのDESTに相当 rsync = { archive = true, links = true, update = true, verbose = false, exclude = { "*.bak", "*.backup" }, rsh = "/usr/bin/ssh -p 2022", -- 接続時に使うsshコマンド。ポートや鍵のファイルはここで指定できる _extra = { "--bwlimit=10000" } } }
settings
で全体的な設定をして、sync
で個別の監視内容や更新時の処理を記述する。sync
は複数記述することができる。
具体的な内容はGitHubのWikiを参照。settingsとsyncとで別の場所なので要注意。manも-help
コマンドも提供されるのでそれらもみると良いかも。
起動するにはlsyncdコマンドを叩けば良い:
$ lsyncd -log scarce /path/to/conf
settings.nodaemon
にfalse
が設定されていればデーモンとして起動する。settings.pidfile
に記述されたpidに対してKILLを発行すれば停止できる。
$ kill -KILL $(cat /path/to/pid)
嵌った点としては、
sync.source
は末尾が必ず/
(スラッシュ)で終わるように処理される。rsyncのSRCは/
の有無で処理が変わるので要注意。sync.rsh
で"ssh [OPTIONS]"
と書くと実行ファイルが見つからないエラーが発生することがあるので、"/usr/bin/ssh [OPTIONS]"
とフルパスで書く必要がある。- lsyncdで対応していないオプションは
sync.rsync._extra
にテーブル{ }
で配列っぽく書く。 - ログの出力レベルは起動時の
-log
オプションでしか設定できない。all
だと全ログを吐き、scarce
だとエラーのみを吐く。
ほかにもinotifyの上限にひっかかるとか、普通rootによるsshログインを拒否ってるからそれ以外のユーザが必要だとかあるけど、参考にしたページを参照していただきたく(眠い)。