| tags:sync categories:server

Unisonの設定

滞在先、タイ・チェンライで折りたたみ自転車のタイヤチューブ交換をしました。工賃込みで150バーツでした。 チューブの質がどうだかわかりませんが、安い、ありがたい、ありがとー。

ついでに、ボロボロになった水中眼鏡(度つき)もリフレッシュ、 ダイソーで買ったゴーグルから目にあたる部分を取り替えて完成。 ちなみにバンド部分は中古の子供ゴーグル5バーツから流用。 まぁ、頓珍漢な感じですが、別につけて外を歩くわけではないので、オケ。

水中眼鏡

さて、運用中にのパイ・サーバーとマックブックとの同期を図るため、unisonを設定します。 設定ファイルを作ってunison 設定ファイル名で実行することができます。

同期設定

シンプルな設定ファイルです。新しいファイルを優先して、接続先の設定をします。 ssh経由の接続ですので鍵でのログイン方式に切り替えると良いと思います。

こちら、SSH簡単ログイン を参照のほど。

設定ファイルはvi ~/.unison/tacos_scripts.prfで作成、内容は以下。

# tacos_scripts.prf
# パイ・サーバーとマックブックのスクリプト同期
times = true
prefer = newer

auto = true
fastcheck = true

# 動作確認が取れたらコメントを外してよし。
#silent = true

# ルート・ディレクトリの指定。同期時に最上位となるディレクトリを設定する。
root = /Volumes/Work/Development/Scripts
root = ssh://tacos//home/pi/script

# sshのオプション: ssh -l pi XXXXX
# sshへの接続は鍵を使った方法に切り替え済み
sshargs=-l pi

# 同期したいディレクトリやファイル名を指定する
# 空白は全て
path =

# 除外ファイルリスト
include ignore_filelist_macos
※ 注意:unisonのデフォルト設定ではシンボリックリンクを同期しません。

シンボリックリンクも同期したい場合は、以下のような設定をプロファイルに追記します。

follow = Path ディレクトリ名 または ファイル名

除外ファイル

OSごとに特有のファイルがありますし、同期をしたくないファイルは除外ファイルとして登録しておきます。ignore_filelist_macosにしておきます。設定などのファイル保存先は.unisonフォルダーです。

jin@gallo:.unison $ vi ~/.unison/ignore_filelist_macos

addprefsto = unison_ignore

# for macOS
ignore = Name ._*
ignore = Name .DS_Store
ignore = Name .Trash
ignore = Name .Spotlight-*
ignore = Name .Trashes
ignore = Name .hidden
ignore = Name .hotfiles.btree
ignore = Name .vol

ignore = Name .FBCIndex
ignore = Name .FBCLockFolder

ignore = Name .CFUserTextEncoding
ignore = Name .localized

実行

unison 設定ファイル名で同期します。初回は少し時間がかかるといいますが、ファイル数が少ないので瞬間で終わりました。 同期するファイルの確認を行います、問題がなければ、そのままyで続行します。 同じ名前のファイルがあったら、選択する必要があります(たしか)。

※ 沢山のファイル(例えば1000とか)がある人は、まずは rsync でファイルをコピーしてから行った方が良いかな。
jin@gallo:~ $ unison tacos_scripts
Unison 2.51.2 (ocaml 4.06.1): Contacting server...
Connected [//gallo.goozen.lab//Volumes/Work/Development/Scripts -> //tacos//home/pi/scripts]
Looking for changes
Warning: No archive files were found for these roots, whose canonical names are:
    /Volumes/Work/Development/Scripts
    //tacos//home/pi/scripts

 。。。。。

  Waiting for changes from server
Reconciling changes

local          tacos
dir      ---->            Date Clip.app
dir      ---->            MakeIcons.app
dir      ---->            ResizeRenameImage.app
         <---- file       task_on_reboot.sh
         <---- file       weather_update.py

Proceed with propagating updates? [] y

 。。。。。

[END] Copying resize window.app
UNISON 2.51.2 (OCAML 4.06.1) finished propagating changes at 07:59:09.42 on 18 Aug 2019

Saving synchronizer state
Synchronization complete at 07:59:09  (23 items transferred, 0 skipped, 0 failed)
jin@gallo:~ $

これで、

スクリプトを端末側で修正・コマンドで同期・サーバー側で実行・確認の繰り返し。

という流作業になる。ちょっとだけ面倒が取れるかな。

※ マック側のファイルのスペースは取った方が良いかもしれん。。キャメルからスネーク式に切り替えるかな。。

おまけ:自動化

cron で定期的にunisonによる同期を実行したい場合は-batch オプションを付けて実行すると非対話的に同期が実行されます。

jin@gallo:~ $ unison tacos_scripts -batch

crontab -eに登録して自動化完了です。

マックにての自動化

マックではLaunchAgentsを使って自動化ができます。 設定ファイル~/Library/LaunchAgents/mac-pi-unison.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>
  <!-- label -->
  <key>Label</key>
  <string>mac-pi-unison</string>

  <!-- script -->
  <key>ProgramArguments</key>
  <array>
    <string>/usr/local/bin/unison</string>
    <!-- ここに引数となる設定名を指定します(.prfを除外した名前) -->
    <string>sample</string>
    <!-- Yes/Noを聞かれないバッチ用のオプション -->
    <string>-batch</string>
  </array>

  <!-- launchctl loadしたタイミングで実行するか -->
  <key>RunAtLoad</key>
  <true/>

  <!-- インターバル指定 例) 5分毎 -->
  <key>StartInterval</key>
  <integer>300</integer>

  <!-- エラー内容を捨ててますが、ちゃんと運用したい場合はこの設定もしっかり -->
  <key>StandardErrorPath</key>
  <string>/dev/null</string>
  <key>StandardOutPath</key>
  <string>/dev/null</string>
</dict>

</plist>

そして、LaunchAgentsの読み込みます。

jin@gallo:~ $ launchctl load ~/Library/LaunchAgents/mac-pi-unison.plist

これで、バックグラウンドで5分ごとに動いてくれるようになります。 ただ、私はhazelというアプリを持っているので、それでファイル更新にトリガーで動かしても良いなと思いました。

参考:

See Also

comments powered by Disqus