QA@IT

RubyでRedisをDeamonとして起動するには?

5235 PV

現在、rails3.2と、ResqueというGemを使って開発をしています。

今回の疑問点は、RedisをRubyからどうやってDeamonとして起動するのかわからないのです。

詳細を書いていきます。

このResqueというgemは内部で、RedisというKVSを使っています。
なのであらかじめRedisを実行しておく必要性があります。
このRedisの実行コマンドは

redis-server /usr/local/etc/redis.conf

です。
このコマンドをうつと、画面に色々ログが表示された後に、そのまま止まってしまいます。
止まるというのは、ターミナルのタブが出力専用になり、こちらの入力をCTRL+Cしか受け付けなくなるということです。

なのでRedisをDeamonとして動かす必要性があると考えました。

この場合は恐らくこれでDeamon化できます。

nohup redis-server /usr/local/etc/redis.conf &

しかしこれを止めるためにはpidを調べてkillしなくてはいけませんでした。
なので私としてはできれば、rakeタスクでrake redis:startrake redis:stopの様に実現したいと考えました。

そこでrakeファイルに、nohup redis-server /usr/local/etc/redis.conf &を実行してくれるような処理を書きたいのですが、うまくできません。

どのようにすれば、実現できるでしょうか?

以下に、悪い例として色々試行錯誤した例を書きます。

Shellライブラリ(?)を使ってやる方法

require "shell"

namespace :redis do
    desc "TODO"
    task :start => :environment do
        Shell.def_system_command "nohup", "nohup"
        Shell.def_system_command "redis_server", "redis-server"
        sh = Shell.new
        sh.transact {
            nohup{
                sh.redis_server("/usr/local/etc/redis.conf")
            }
        }
    end
end

これはうまくいきませんでした。恐らく文法的なエラーだとは思うのですが、色々試行錯誤中です。

Process.daemonを使ってやる方法

Process.daemon

`redis-server /usr/local/etc/redis.conf`

これはとりあえず直接このrubyファイルを実行しました(rakeからではなく)。
しかしこのプログラムを実行するとこのRuby自体のDeamonと、redis-serverのDeamon?が2つでき、rubyのDeamonを切っても、redisのDeamon?はきれませんでした。

回答

redisは設定ファイルに「デーモンとして動作する」項目があります。

redis 2.0.3 documentation >> 設定ファイル 起動モード設定 にdaemonizeという項目があります。
またpidはデフォルトで /var/run/redis.pid に保存されます。

編集 履歴 (0)
  • お返事ありがとうございます。

    このような項目があったのですね。確かにdefaultでredisをdemonで起動する方法を疑うべきでした・・・。

    おかげさまで問題なく起動できました。
    -

stopの方は無いですが、

起動に関しては

system "nohup redis-server /usr/local/etc/redis.conf &"

またはShellの部分を

require "shell"

Shell.def_system_command "nohup", "nohup"
Shell.alias_command("nohup_redis_server", "nohup", "radis-server","/usr/local/etc/redis.conf","&")
sh = Shell.new
sh.transact {
   nohup_redis_server
}

というようにしてはいけませんか?

編集 履歴 (0)

解決しました。ありがとうございます。

最終的にはこのようなrakeファイルになりました。

namespace :redis do
    desc "TODO"
    task :start => :environment do
        command = %q(redis-server /usr/local/etc/redis.conf)
        systemu command
        p command
    end

    task :stop => :environment do
        pid = 0
        File::open("/usr/local/var/run/redis.pid") {|f|
            pid = f.gets
        }

        command = "kill " + pid
        systemu command

        p command
    end
end

このプログラムは、ledsunさんの回答にあるConfigのオプションを指定してあることが前提です。

編集 履歴 (1)

お返事ありがとうございます。

system "nohup redis-server /usr/local/etc/redis.conf &"

これを実行すると、起動できました。

`nohup redis-server /usr/local/etc/redis.conf &`

だと実行できないのに不思議ですね。
ただ、この方法の問題点としてはsystemの戻り値が boolなので、 pidが取得できないことです。

<< またはShellの部分を

これは残念ながら起動できませんでした。特にエラーがでてる訳ではないので、原因は不明です。

編集 履歴 (0)
ウォッチ

この質問への回答やコメントをメールでお知らせします。