unoh.github.com

daemonsで簡単デーモン

Tue Oct 23 18:29:34 -0700 2007

komagataです。

mongrelを入れるときに一緒に入るdaemonsというライブラリが気になったので調べてみました。

daemonsは大まかに、サーバープログラムをstart/stop/restartなどのおなじみのやり方で操作できるようにするラッパーの機能とプログラム中で使って自分のプロセスをデーモンにする機能があるそうです。

引数を出力し続けるプログラムをデーモンにしてみたいと思います。

puts_arg.rb:

#!/usr/bin/env ruby
 
loop do
  puts ARGV.inspect
  sleep(1)
end


実行結果。

$ ruby puts_arg.rb a b c
["a", "b", "c"]
["a", "b", "c"]
["a", "b", "c"]
(略)


これにdaemonsを使ってラッパーを用意します。

puts_arg_control.rb:

#!/usr/bin/env ruby
 
require 'rubygems'
require 'daemons'
 
Daemons.run('puts_arg.rb')


これでputs_arg.rbにたいしてstart/stop/restart/runなどの操作ができるようになります。(runは非デーモンの状態で動かします)

引数は下記のように'--'の後に渡せば管理対象のプログラムへの引数になります。

$ ./puts_arg_control.rb run -- a b c
["a", "b", "c"]
["a", "b", "c"]
["a", "b", "c"]
(略)


restartやstopのためにデフォルトではプログラムのあるディレクトリにpidファイルが作成されます。(この場所もDaemons.runメソッドのオプションで細かく設定できます)

自分自身をデーモン化する方法はdemonizeを実行するだけです。

#!/usr/bin/env ruby
require 'daemonize'
include Daemonize

daemonize()

loop do
puts ARGV.inspect
sleep(1)
end

やっている内容はこちらで説明されているのとほとんど変わりません。

以前書いたdRubyのサーバーもdaemonsで簡単にデーモン化できました。Rubyでちょこっとサーバーを書くときにお勧めです。