😀

OSXのLaunchAgentでホストOSのファイル監視してリモートサーバーにrsyncして同期する方法

2022/11/28に公開

最初は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