rails – bluegold https://blog.bluegold.me OpenSolaris と MacBook で自宅ネットワークを構築するメモ Mon, 23 Aug 2010 18:27:31 +0000 ja hourly 1 https://wordpress.org/?v=5.2.1 6047458 Redmine を監視して再起動する https://blog.bluegold.me/2010/04/monitor-and-restart-redmine-when-error-500/ https://blog.bluegold.me/2010/04/monitor-and-restart-redmine-when-error-500/#respond Tue, 20 Apr 2010 16:35:50 +0000 http://blog.bluegold.me/?p=444

正確には Redmine が原因なのかどうかは判明していませんが、OpenSolaris 上に構築した Redmine が起動後何時間かすると500 Internal Errorを返すようになってしまいました。

Redmine は以下のような環境で動かしています。

  • Redmine 0.9.3
  • OpenSolaris 2009.06
  • Ruby 1.8.7-p249
  • Rails 2.3.5
  • Unicorn 0.97.0
  • nginx 0.7.65

Ruby は /opt/sunstudio12.1/bin/cc(Sun Studio Express 12)でビルドしています。

OpenSolaris に付属の /usr/bin/ruby を使っていた時には問題なく動作していたんですが、Redmine 0.9.3 にバージョナップした所、致命的な問題が発生したため、Ruby を自分でビルドするように変更していました。

落ちているの気がついたら手動で再起動をしていたのですが、さすがにメンドウになってきたのでスクリプトを書きました。

#!/bin/sh

while `/bin/true`
do
    http_code=`curl --insecure -w "%{http_code}" -s -o /dev/null https://redmine/login`
    ts=`date +"%Y/%m/%d %H:%M:%S"`

    if [ $http_code -eq 200 ]; then
        echo $ts OK
        sleep 300
        continue
    fi

    cd /var/www/redmine
    pid=`cat tmp/pids/unicorn.pid`

    kill -USR2 $pid
    sleep 5
    kill $pid

    echo $ts unicorn $pid reloaded.
done

exit 0

手順としては、5分おきに curl で HTTP のステータスコードのみを受け取り、200 OKが帰ってこない場合は再起動、という流れです。

Unicorn は SIGUSR2 を送ると自分自身を fork() してから終了するはずなのですが、終了せずに残るので子プロセスの起動を待ってから SIGTERM を送っています。

とりあえずは、これで気にはならなくなりましたが。。。

そのうち、God あたりに切り替えよう。

]]>
https://blog.bluegold.me/2010/04/monitor-and-restart-redmine-when-error-500/feed/ 0 444
Rails 2.3 のタイムゾーン https://blog.bluegold.me/2009/09/rails-2-3-active_record-timezone/ https://blog.bluegold.me/2009/09/rails-2-3-active_record-timezone/#respond Mon, 14 Sep 2009 11:08:34 +0000 http://blog.bluegold.me/?p=278 2006年頃に Rails 1.2 で作成したアプリケーションを Rails 2.3 にアップグレードしています。

プログラムの移行自体は1週間ほどで完了したのですが、テストをしていてタイムゾーン関連の問題に遭遇しました。

データベースに有効期限を表すフィールドがあるのですが、1時間前から1時間後まで有効なレコードを作成して、現在が有効期間内かどうかを調べるテストが失敗したので問題に気がつきました。

Rails 2.x ではタイムゾーンが導入されたのは知っていたので、下のように設定を行っていました。

config.time_zone = 'Tokyo'
config.active_record.default_timezone = 'Tokyo'

しかし、ログを見ていると JST と UTC とタイムゾーンが混ざっているようだったので、単純なアプリを作成して調べてみました。すると、以下のような結果に

c = Sample.find(:first)
>> c[:created_at]
=> Mon, 24 Aug 2009 17:09:49 +0000
>> c.created_at
=> Tue, 25 Aug 2009 02:09:49 JST +09:00
>> c[:created_at].class
=> DateTime
>> c.created_at.class
=> ActiveSupport::TimeWithZone

同じフィールドでも [] メソッドでデータを取得するのと、フィールド名を指定して取得するので、クラスもタイムゾーンも異なるんですね。ちょっとビックリしました。

どこかにタイムゾーンを意識しないコードがあって、この2つを混同してしまってるんだろうな。
調べるのはメンドクサイな。

]]>
https://blog.bluegold.me/2009/09/rails-2-3-active_record-timezone/feed/ 0 278
Rails 1.2.6 と gem 1.3.0 を一緒に使う https://blog.bluegold.me/2008/12/rails-126-and-gem-130/ https://blog.bluegold.me/2008/12/rails-126-and-gem-130/#respond Wed, 17 Dec 2008 16:18:53 +0000 http://blog.bluegold.me/?p=132 Merbが最近はやっているようなので、インストールして使ってみようと思いました。Merb には Rubygems 1.3.0 以上が必要なのでアップデートしたところ、仕事で開発している Rails 1.2.6 で作られたアプリケーションに gem の deprecated メッセージが出てくるようになってしまいました。

たとえば script/console を実行すると以下のようなメッセージが出てきます。

$ script/console 
Gem::SourceIndex#search support for String patterns is deprecated
./script/../config/boot.rb:20 is outdated
Loading development environment.
Gem::SourceIndex#search support for String patterns is deprecated
./script/../config/../config/boot.rb:20 is outdated
>> 

このアプリは Rails を使っているのでとうぜんWeb用のアプリなのですが、管理用に独自のコマンドラインシェルを用意しています。こちらのコマンドの実行時にも同様のメッセージが出てきてしまっています。「Rails 2.2 系に上げるいい時期かな」とも思わないでもないのですが、製品として提供している物なので、今期末にいくつか控えている納品を終えるまではバージョンを上げるわけにもいきません。

仕方がないのでクイックハック
script/console の最初で stderr を /dev/null に捨てるようにしました。

#!/usr/bin/env ruby
$stderr.reopen('/dev/null')
require File.dirname(__FILE__) + '/../config/boot'
require 'commands/console'

deprecated なメッセージを簡単に抑制する設定とかもあるんだろうか。。。

]]>
https://blog.bluegold.me/2008/12/rails-126-and-gem-130/feed/ 0 132