同期
今まで研究でデータを出すときは「ローカルで開発」→「ローカルでテスト」→「Subversionにコミット」→「クラスタで作業コピーアップデート」→「クラスタでテスト」としていたのですが,コードを変更するたびにいちいちSubversionに投げるのもばからしいし,そもそもクラスタでは開発しないのだからコピーでいいじゃないかと思いました.
方法
しかしscpでしこしこコピーするのは面倒だし,ファイルの同期を取るのがめんどくさい.で,調べてみるとrsyncというものがあるではないですか!
上記リンクではソースからビルドしてますが,Cygwinパッケージにrsyncがあったので早速インストール.で先輩が使っていたスクリプトをちょろっと改造.
- sync_node.sh
#! /bin/bash case $1 in commit) for x in $(seq 1 8); do echo "--- commit : node00$x ---" rsync -avz $2 username@node00$x:$3 done ;; del) for x in $(seq 1 8); do echo "--- del : node00$x ---" rsync -avz --delete $2 username@node00$x:$3 done ;; collect) for x in $(seq 1 8); do echo "--- collect : node00$x ---" rsync -avz username@node00$x:$3 $2 done ;; *) echo "usage : sync_node {commit|del|collect} [local dir] [remote dir]" ;; esac
オプション
rsyncにあるオプションを使いそうなところだけざっとまとめてみた。詳細はこちら。
-a, --archive | アーカイブ転送 |
-v | コピー中のファイルを表示 |
-u, --update | タイムスタンプがコピー先より新しいものだけコピー |
-p, --perms | パーミッションを維持 |
-t, --times | タイムスタンプを維持 |
--delete | コピー元で削除されたファイルはコピー先でも削除 |
あとコピー元のディレクトリにスラッシュをつける場合とつけない場合で
$ rsync -a /source/dir1 /target/dir2 $ rsync -a /source/dir1/ /target/dir2
前者の場合はコピー元のディレクトリもコピー。(つまりdir1という名前のディレクトリがdir2の中にコピーされる)
後者の場合はコピー元のディレクトリの中身がコピーされる。(つまりdir1とdir1の中身が同じになる)
まとめ
Subversionは便利だけど適材適所でいろいろ検討するとなおよい.