テキストファイルをbashコマンドで

この記事はだいぶ前に書かれたものなので情報が古いかもしれません
bash……いや、バッシュ

この記事を三行にまとめると

lsyncdでCakePHPのappフォルダを同期させる
tmpフォルダは同期させないようにする
tmpの下にあるキャッシュファイルは削除だけ同期させたい
ちょっと前にcacheの置き場はtmpのままが良い?っていう記事を書いたんですが、今回はその続きみたいな感じです。

lsyncdっていう、サーバー間でファイルやディレクトリを同期できるミラーリングツールがあるんですけど、ある条件のときにどうしたら良いのかなーって悩んでおりまして……この方法が良いかどうかは分からないんですけど、とりあえず思いついたことがあったので、やってみました。



ある条件とは?

簡単に言うと、以下の通り。

・lsyncdでCakePHPのappフォルダを同期させる
・tmpフォルダは同期させないようにする
・tmpの下にあるキャッシュファイルは同期させたい
・いつでもじゃなくて、削除したときだけ同期させたい

lsyncdを使ってCakePHPのファイルを複数のサーバーで同期させるわけなんですけど、tmpの下にあるエラーログとか、そういうのは別に同期する必要はないので、tmpフォルダ以下は同期しないように設定しておく。そこまではlsyncdの設定でできます。

そんでもってCakePHPには、tmpの下にあるcacheフォルダに、モデルとかのキャッシュファイルを書き込む機能があります。基本的には同期する必要がないんだけど、例えばデータベースに変更を加えたりしたとき、このキャッシュファイルを削除しないとエラーになることがある。だからキャッシュファイルを削除したときだけ、同期先のサーバーのファイルも消えてくれれば助かるよねーっていう、そんな感じです。

もしかしたらlsyncdの設定だけでできることなのかもしれないんだけど、ちょっと調べた限りではいまいちそのやり方が分からなかったんで、別のやり方でやることにしました。



自分でrsyncコマンドを打つ

結局のところlsyncdってのは、同期元のサーバーにあるファイルを更新したタイミングで自動的にrsyncコマンドを実行してくれるもの(で合ってる?)なので、別にlsyncdに頼らず任意のタイミングで手動でrsyncコマンドを打てば良いんじゃないかと。それならtmpの下だろうが何だろうが好きに同期できる。

デフォルトの設定だと、キャッシュファイルは「tmp/cache/models」と「tmp/cache/persistent」というフォルダの中に書き込まれるようになってます。なので、以下のような手順で削除同期を行ってみる。

//キャッシュファイルを全削除
# rm -f tmpまでのパス/cache/models/* tmpまでのパス/cache/persistent/*

//削除状態を同期
# rsync -a --delete 同期元tmp/cache/ 同期先のアドレス:同期先のtmp/cache/

やっていることとしては、まずsshで同期元サーバーに接続して、rmコマンドを使って同期元サーバーのキャッシュファイルを全部削除し、rsyncコマンドを打って同期先サーバーも同じ状態にしている感じです。

「tmpまでのパス」とか「同期元のtmp」ってのは、サーバーのtmpフォルダまでの絶対パスだと思ってください。「/var/www/cakephp/app/tmp/」とか、そういう感じ。同期先のアドレスってのは、サーバーのIPアドレスです。別サーバーに同期する場合は、「user@255.255.255.255」とか「root@example.com」みたいな、ようはsshで接続するときのような書き方が必要になるようです。

rmコマンドやrsyncコマンドの詳細については、ググってみてくだせえ。↓の辺を参考にすると良いと思う。

rmコマンド – UNIXの部屋

rsyncコマンド – UNIXの部屋



bashコマンドを使ってみる

こっからはおまけです。

毎回上記のコマンドを打っても良いんですけど、もうちょっとだけ簡単にしてみようってことで、試しにbashコマンドを使ってみることにします。

まず適当なテキストファイルを用意して、その中に上記の二行を書く。それをbashコマンドで読み込むと、一回の操作でrmコマンドとrsyncコマンドが実行できるってすんぽうです。

//viモードで適当にファイルを作成
# vi /var/www/delete_cache.txt

//delete_cache.txtの中身
rm -f tmpまでのパス/cache/models/* tmpまでのパス/cache/persistent/*
rsync -a --delete 同期元tmp/cache/ 同期先のアドレス:同期先のtmp/cache/

//bashコマンドを実行
# bash /var/www/delete_cache.txt

まあ、bashコマンドなんてほとんど使ったことないから、そもそもこんなことして大丈夫かどうかもよく分からんのですが、こうしておけば、次からはbashコマンドを打つだけで良くなるので、ちょいお手軽ですね。






先日は、キャッシュファイルの保存場所をtmpの外に出して、キャッシュファイルも常に同期してれば良いじゃんとか思ったんですけど、実際やってみたらlsyncdが数秒に一回くらいのペースでキャッシュファイルを同期させてる動きがあったもんで、こりゃさすがにあれだなって思って、とりあえずtmpの下に戻して、今回のようなやり方にしてみました。

今回はこれで良いとしても、やっぱりキャッシュを一元管理するなら、キャッシュサーバーは別に用意して、そっちで管理するようにした方が良いんですかねぇ。
 もしかしたら何か関連しているかも? 
 質問や感想などお気軽にコメントしてください