macOSにおけるローカルディレクトリ間自動双方向同期

あまりないことかと思いますが、先日、ローカルディレクトリ間の自動双方向同期を実現する必要がありました。

ここでいう「ディレクトリ間の自動双方向同期」とは、2つのディレクトリのうちの一方でファイルの作成、修正、削除等を行うと、もう一方のディレクトリで自動的に対応するファイルの作成、修正、削除等が行われ、その逆も同様のことが行われるといった動作のことです。

以下に説明するように、lsyncdとlaunchdを用いることにより、タイトルのことを実現することができました。 なお、Homebrewがインストールされていることを前提としています。

lsyncd

色々と調べたところ、ローカルのディレクトリとリモートのディレクトリとの間の自動双方向同期を実現するソフトウェアとして、lsyncdが見つかりました。 このソフトウェア、マニュアル1によればローカルディレクトリ間の自動双方向同期にも対応しているみたいです。

というわけで、まずはlsyncdをインストールします。 また、バージョン2.2.1からlsyncdはバージョン3.1以上のrsyncを必要とするようですが、rsync --versionによれば、macOSにデフォルトでインストールされているrsyncはバージョン2.6.9でした(Mojaveにて確認。)。 そのため、新しいバージョンのrsyncもインストールします。 即ち、

brew install lsyncd rsync

次に、以下のような内容のlsyncdの設定ファイルを作成します。 この設定ファイルはどこに作成してもよく、ここでは/path/to/lsyncd.confであるものとします。

settings {
    logfile     = "/tmp/lsyncd.log",
    statusFile  = "/tmp/lsyncd.status",
    nodaemon    = true
}

sync {
    default.rsync,
    source  = "/path/to/sync0/",
    target  = "/path/to/sync1/",
    delete  = "running",
    exclude = { '.DS_Store' },
    rsync   = {
        binary  = "/usr/local/bin/rsync",
        _extra  = {
            "--owner", "--group"
        }
    }
}

sync {
    default.rsync,
    source  = "/path/to/sync1/",
    target  = "/path/to/sync0/",
    delete  = "running",
    exclude = { '.DS_Store' },
    rsync   = {
        binary  = "/usr/local/bin/rsync",
        _extra  = {
            "--owner", "--group"
        }
    }
}

なお、/path/to/sync0/及び/path/to/sync1/は、自動双方向同期したい2つのディレクトリのパスです。

これで、lsyncdの準備は完了です。

launchd

真に「自動」双方向同期であるためには、macOSの起動直後から当該双方向同期が有効となっている必要があります。 そこで、macOSを起動すると、上記設定ファイルの内容でlsyncdが自動的に起動するように設定します。 macOSにおいてlsyncdは管理者権限で実行する必要があるために、この設定にはlaunchdを用います。

以下のような内容のlaunchdの設定ファイルを作成します。 この設定ファイルは/Library/LaunchDaemons/に作成する必要があり、ここでは/Library/LaunchDaemons/com.sample.lsyncd.plistであるものとします。 なお、/Library/LaunchDaemons/におけるファイル作成には管理者権限が必要です。

<!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>
    <string>com.sample.lsyncd</string>
    <key>ProgramArguments</key>
    <array>
            <string>/usr/local/bin/lsyncd</string>
            <string>/path/to/lsyncd.conf</string>
        </array>
        <key>RunAtLoad</key>
        <true/>
    </dict>
</plist>

これで、lanuchdの準備も完了です。

ローカルディレクトリ間自動双方向同期の開始

単純に、macOSを再起動すればよいです。