Browse Month: October 2010

Passenger 3.0.0 はまり編

Passenger 3.0.0 がリリースされました。今回のリリースには、おもにパフォーマンス向上がメインのようなので、さっそく CentOS 5.2 x86_64 のテストサーバにインストールしてみました。

Passenger のインストールは、いつものとおりです。

$ sudo gem install passenger

Successfully installed daemon_controller-0.2.5
Successfully installed spruz-0.1.5
Successfully installed file-tail-1.0.5
Successfully installed passenger-3.0.0

Apache で使っているので、Apache モジュールをコンパイルします。

$ sudo passenger-install-apache2-module

——————————————–

Checking for required software…

* GNU C++ compiler… found at /usr/bin/g++
* Curl development headers with SSL support… not found
* OpenSSL development headers… found
* Zlib development headers… found
* Ruby development headers… found
* OpenSSL support for Ruby… found
* RubyGems… found
* Rake… found at /usr/bin/rake
* rack… found
* Apache 2… found at /usr/sbin/httpd
* Apache 2 development headers… found at /usr/sbin/apxs
* fastthread… found
* Apache Portable Runtime (APR) development headers… found at /usr/bin/apr-1-config
* Apache Portable Runtime Utility (APU) development headers… found at /usr/bin/apu-1-config

Some required software is not installed.
But don’t worry, this installer will tell you how to install them.

Press Enter to continue, or Ctrl-C to abort.

curl が SSL サポートしていないというエラーでなってしまい、Apache モジュールをビルドできません。curl と curl-devel パッケージは、ちゃんとインストールされているのにおかしいと思って調べてみると、ここに答えが書かれていました。

どうやら、curl 自体には問題はなく、必要なパッケージが足りていないだけのようです。

次のパッケージを、追加でインストールしました。

$ sudo yum install krb5-devel libidn-devel

上のパッケージをインストール後、passenger-install-apache2-module コマンドを実行すると、ちゃんと Passenger Apache モジュールをビルドすることができました。

これは、エラーメッセージの内容とは、原因がまったく違っていたため、すこしはまりました。。。

ひととおり評価して問題がなければ、さっそく本番に投入してみたいと思います。

cron の直列実行

久しぶりのブログになります。

cron でとあるバッチ処理を setlock を使って、毎時順番に直列実行しています。

このバッチ処理は、過去 1 時間前のアクセスログをごにょごにょ集計しています。仮に、このバッチ処理は、1.rb、2.rb、3.rb、の 3 つのプログラムがあるとしましょう。2.rb は、必ず 1.rb が実行し終わったあとに実行することを前提、3.rb は、必ず 2.rb が実行し終わったあとに実行することが前提となっています。

cron には、次のように 5 分刻みで設定されています。

5 */1 * * * /usr/bin/setlock /tmp/hoge.lock /tmp/1.rb

10 */1 * * * /usr/bin/setlock /tmp/hoge.lock /tmp/2.rb

15 */1 * * * /usr/bin/setlock /tmp/hoge.lock /tmp/3.rb

それぞれのプログラムの最初には、過去 1 時間前を取得する、次のようなコードが書かれています。

target_date = DateTime.now.ago(60 * 60)

この状態で、1.rb から 3.rb まで、すべて 1 時間以内で終了すれば問題がないのですが、1 時間以上かかってくると、当然ながら問題が出てきます。

1 時間以上かかっても大丈夫なように、それぞれのプログラムに対象の日時を渡すように変更して、次のように cron を変更しました。

5 */1 * * * /usr/bin/setlock /tmp/hoge.lock /tmp/1.rb –date `/bin/date –date ‘1hours ago’ +\%Y-\%m-\%d`

10 */1 * * * /usr/bin/setlock /tmp/hoge.lock /tmp/2.rb –date `/bin/date –date ‘1hours ago’ +\%Y-\%m-\%d`

15 */1 * * * /usr/bin/setlock /tmp/hoge.lock /tmp/3.rb `–date /bin/date –date ‘1hours ago’ +\%Y-\%m-\%d`

これで、毎時のタスクがどんなに時間がかかっても、毎時間の処理が正しく行われることになります。

ここまでくると cron の設定が複雑になってしまうので、まとめたシェルスクリプトを書くか、バッチプログラムをまとめてもいいかもしれません。

今のところ、それほど毎時実行する cron は多くないので、しばらくこれで様子をみようと思います。