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でちょこっとサーバーを書くときにお勧めです。