😀
OSXのLaunchAgentでホストOSのファイル監視してリモートサーバーにrsyncして同期する方法
最初はnodejsのwatch使ってやろうと思ったが、調べてる内にmacで完結できることはmacでやろうと思ってtryしてみた。
例えばvirtualboxとかでプロジェクトのgitカレントを共有フォルダ設定していて更にリモートサーバーに飛ばしたい場合等に使う予定(まだ試していないが。。。。)
参考にしたサイト
LaunchAgentのplistを作る
習慣らしくてplistとタグ名は一致させるらしい(タグは.plistを除いた形)
- usernameと記載されているものは自分のuser名に変更してください
~/Library/LaunchAgents/me.username.rsync.plist
~/Library/LaunchAgents/me.username.rsync.plist
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>Label</key>
<!-- Label plistと同一の名前 -->
<string>me.username.rsync</string>
<key>ProgramArguments</key>
<array>
<string>rsync</string>
<string>-av</string>
<string>--delete</string>
<string>-e</string>
<string>ssh</string>
<!-- ホストのrsync対象元 -->
<string>/Users/username/sample/</string>
<!-- リモートのrsync対象先(dest) -->
<string>vagrant@192.168.56.103:/home/vagrant/sample</string>
</array>
<key>WatchPaths</key>
<array>
<!-- usernameは自分のユーザー名に変更する -->
<string>/Users/username/sample/</string>
</array>
<!-- ログの出力先設定デフォルトは/var/log/system.logに書かれるらしい。最初は書いておいて動作上問題がなければ/dev/nullにしてもよいと思う(そうしないとログで容量が圧迫される -->
<key>StandardOutPath</key>
<string>/tmp/me.username.monitor.out.log</string>
<key>StandardErrorPath</key>
<string>/tmp/me.username.monitor.err.log</string>
</dict>
</plist>
ホストのrync元のディレクトリを作る
launchAgentのWatchPathは最初にsync元のディレクトリ作っとおかないと動かないのでloadする前に作る
~/ホストOS(OSX)
mkdir /Users/username/sample/
リモートのrync先のディレクトリを作る
rsyncがこけるのでこれも同様に
~/リモートサーバー
mkdir /home/vagrant/sample
LaunchAgentに作ったplistをloadさせる
launchctl load ~/Library/LaunchAgents/me.username.rsync.plist
ホストOS側で試しにファイル作って見る
/Users/username/sample/sample.txt
echo 'test' > /Users/username/sample/sample.txt
リモートに反映されているか確認する
~/リモートサーバー
ll /home/vagrant/sample
# sample.txtが作られていれば問題なし!!!
【補足】plistの更新について
launchAgentはplistを更新しても一回unloadしてloadをし直さないとplistの更新分は読み込み直さないので注意
launchctl unload ~/Library/LaunchAgents/me.username.rsync.plist
最後に
これでローカルでファイルゴリゴリ触れる〜
Discussion