Net::SSH と Net::SCP
dbm とかのファイルを生成して配布するスクリプトなんぞをよく書くわけなのですが、配布するときに downtime をなくすためにこんな小細工をしている。
- 配布先のプロセスは dbm file に mmap するなどの関係で db file は open したままになっている
- dbm file の内容を更新するために、新しく作った dbm file は temporary な名前になるように配布先マシンに scp する
- scp が終わったら既存の dbm file を .bak みたいなファイル名に mvして、temporary な名前でおかれた dbm file を本来の名前に mv する。
- dbm file を使っているプロセスの reattach の部分は、dbm file の名前を stat して inode やら mtime やら ctime が変わっていたら unmap, close, open, mmap という具合に、新しい dbm file に reattach する。
で、こんな処理をするためのスクリプトを、案件やシステムの目的が違えどもショッチュウ書いているわけでして。(現在なんか同様なスクリプトを2つの目的で書いていたり。) 同じような処理ばっかりになっているので、そろそろこの辺をライブラリ化しようかなと思ったりしているわけです。
ssh やら scp するときには、普通に system() とか使っているのですが、もうちょっとかっこよくできないかなと思って CPAN あたってみたところ、Net::SSH や Net::SCP なんていうものがあるのですね。 これ使えば下のように system() に引数をダラダラと書かなくってよくなるのかもと。
$ret = system("/usr/bin/scp -options -q hoge@host localdir/");
今日なんか、remote machine の特定のファイルが存在するかどうかをチェックするために、こんな ssh のコマンド書いていたしなぁ。
#!/bin/sh
if ssh hoge@host test -f /home/hoge/fuga ; then
echo "Found"
else
echo "Not found"
fi
今のところ remote にある数個のファイルを test する程度で終わっているので特に問題ないのだが。 sshやSSLの場合、暗号通信の関係で接続時のキー交換を行うハンドシェイク部での処理量が多いため、sshのコマンドを発行する回数が多いとそれなりに処理時間が長くなってしまう。 これが数千個のファイルのチェックとかになると、shell script そのものを ssh で remote に流し込まないとダメなのかなぁ。 となると、ssh hoge@fuga sh -e '....'
みたいなものをがんばって書くのか。。。 なんとなく Remote Procedure Call の Procedure を手軽に流し込める機能が欲しくなってきたぞ。
コメント
コメントを投稿