読者です 読者をやめる 読者になる 読者になる

本当は怖い情報科学

情報系大学院生の趣味&実益ブログ。

リモートサーバー上のデータに対して作業するためのスクリプトを作り始めた話

スパコンとかで作業をしていると、スパコン上で生成されたデータを手元に持ってきて処理したいことが多い。そのための方法はいくつ存在する。

手動コピー

当然ながら、一番単純(≠簡単)な方法は、自分の手でscpやrsyncを用いてデータをコピーする方法だ。

監視・同期デーモンプログラムを使う

Lsyncd[1]のような、コピーと同期を自動で行ってくれるデーモンプログラムを使う方法である。Lsyncdの場合、データが変更されるとrsyncを用いてデータを同期してくれるらしい。

[1] lsyncd - Lsyncd (Live Syncing Daemon) synchronizes local directories with a remote targets - Google Project Hosting

sshfs

sshfsは、ある意味で最終兵器といえる。リモートのディレクトリを、SSHをトンネルとしてマウントしてくれる方法だ。ファイルシステムレベルで動作するので、速度以外はローカルのファイルと完全に同一に扱えて、なおかつ同期も完全となる(そもそもデータが分散しない)。

問題点

通常の環境であれば、sshfsを使えばOKだろう(Windowsがサポートされているのかどうかは知らないが)。しかし、自分の環境ではいろいろ特殊な状況が重なっていて、話が単純では無い。

特殊な状況というのは、

  • レイテンシの大きい環境で作業する必要がある(国外)
  • 時間当たりのSSH回数に制限がある(同一IPからの単位時間当たりのSSH回数が上限に達すると接続を拒否される)

という感じである。なので、以上を踏まえて上記の3手法の長所・短所をまとめてみると以下のようになる。

長所 *短所
手動コピー 単純(≠簡単) 面倒くさい
lsyncd 同期の手間が無い rsyncの呼び出し回数をコントロールできない
sshfs 同期の手間が無い・SSHコネクションは基本的に1つでOK アクセス速度が落ちる/接続切断・タイムアウトで不安定になると、最悪OSごと落ちる(macだけかも)

というわけで自分で書く

結局、 * 同期の手間が無く * タイムアウト・切断に対して堅牢 * できればファイルをローカルにコピーしてアクセス速度を上げたい

という要求になり、これを満たすソフトが今のところ見つからないので、自分で書くことにした。ざっと調べてみたら、Watchdog[2]というライブラリを使うとローカルのファイルの更新検知を容易に行うことができるようなので、これをpython-daemon[3]と組み合わせれば良さそうだ。

[2] watchdog 0.8.1 : Python Package Index

[3] python-daemon 1.5.5 : Python Package Index

【広告】