タイトルの通りです。Vagrantにはrsync-autoという自動で勝手に同期をとり続けてくれる便利な機能があります。

会社ではWindows上でVagrantを動かしてrsync-autoを使ってWindows側で書いたコードの同期をとってWebサイトの開発をやっています。余談ですが、各々のマシン上にそれぞれのVagrantを立ち上げてDBだけ共通のDBを見るようにしています。

しかし、このrsync-autoかねてより、以下のような不満がありました。

  • 遅い時があるので反映されずにイライラする
  • 気が付いたら落ちてることがある

加えて、ここ数日rsync-autoは動いているのになぜか同期されないという問題に直面しました。本来であれば同期されない原因を探るべきなんですが、上記2つの問題もあったのでオレオレ無限rsyncシェルスクリプトを作ることにしました。

前提


Bash on Windowsでやってます。途中「MINGW + MYSYS」でやろうかとも思ったのですが、こっちはエラーがでたのであきらめました。

コード


最終的に下記のようなコードになりました。同期をとるディレクトリとか除外するディレクトリとか接続先の情報とかは環境にあわせて変更してください。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
#!bin/sh

#--log-file ./rsync.log \

echo "[INFO] Start rsync."

while :
do
rsync -ur \
--exclude '.git/' \
--exclude '.vagrant/' \
--exclude '.vscode/' \
--exclude '/RECYCLER/' \
--exclude '/RECYCLED/' \
--exclude '/$Recycle.Bin/' \
--exclude '/System Volume Information/' \
--exclude '/desktop.ini' \
--exclude '*/thumbs.db' \
--exclude '*.gitignore' \
-e 'ssh -i /home/user/.ssh/private.pem' ./src/ vagrant@192.168.33.10:/home/user/src/
done

こいつを適当なファイル名で作成して、同期をとりたいコードが入っているディレクトリ(上記のコードだとsrcディレクトリ)の一階層上に配置します。あとは実行するだけ。また、ログを出力したい場合はコメントアウトしている--log-file ./rsync.logrsyncのオプションに指定すると出力されます。

注意点としては「Ctrl + C」で中断してもプロセスが残ります。killコマンドでプロセスを殺すか、このスクリプトを実行しているコマンドプロンプトのウインドウを閉じるかしてプロセスを終了させる必要があります。

詰まったところとか


まずsshで同期するにあたって、パスワードの自動入力にぶち当たりました。ローカルでしか使わないVagrantなのでパスワード認証にしていたのです。でapt-get installでパスワード自動入力に必要なパッケージsshpassとかexpectをインストールしようとしたのですがapt-get installでエラーが出て解消がめんどくさかったのであきらめました。

次に、「MINGW + MYSYS」でやろうかと思ったのですが、こっちもrsyncでエラーがでたのであきらめました。

結局、SSH公開鍵認証でパスフレーズなしでやりました。ただ、これも一つ前の記事に書いている点でいくらか詰まりました。

あとは、画像が大量に入っているディレクトリの同期を取ろうとするとrsyncが一向に進まなくなりました。もともとVagrantのrsync-autoでも画像が入ってるディレクトリは同期の対象外にしていたので、同期の対象外とすることで対応しました。

その他


今回の件とか、以前書いたDocker周りの問題 もあってWindowsで開発するのしんどいという気が高まりマクリスティになりました…