高橋征義です。宣伝モードです(_o_)

"Mitsuyasu Ichimura" <mitsuyasu / beatum.jp>さん wrote:
> デーモン・プロセスをRubyで作る場合、やり方はネットで
> 調べることができるのですが、本質的な理解ができていま
> せん。Cでのデーモン・プロセスの作り方に関しては書籍を
> 持っています。
> 
> この件に関して良いRubyの参考書があれば、ご教示頂きた
> いと思います。不躾ですが、宜しくお願いいたします。

つい先日発売されました、まつもとゆきひろ監修・
青木峰郎+後藤裕蔵+高橋征義著の『Rubyレシピブック 268の技』
(ソフトバンクパブリッシング、ISBN4-7973-2429-5)のp.351に、
そのものずばりの「デーモンになる」というレシピがあります。
↓こんな感じです。

  def daemon
    return yield if $DEBUG
    Process.fork{
      Process.setsid
      Dir.chdir "/"
      trap("SIGINT"){ exit! 0 }
      trap("SIGTERM"){ exit! 0 }
      # 設定ファイルを読み直すなどのハンドラを設定してもよい
      trap("SIGHUP"){ exit! 0 }
      File.open("/dev/null"){|f|
        STDIN.reopen f
        STDOUT.reopen f
        STDERR.reopen f
      }
      yield
    }
    exit! 0
  end

  # 使用例: Rubyスレッドを使ったTCPデーモン
  daemon{
    server = TCPServer.new(port)
    while true
      Thread.fork(server.accept){|sock|
        begin
          # ソケットのハンドリング
        ensure
          sock.close unless sock.closed?
        end
      }
    end
  }

『Rubyアプリケーションプログラミング』(とーぜんこの本も
持ってます:-))の例に比べると、比較的シンプルで、再利用は
しやそうだけど、特権ユーザとかのことは特に考えていなく
(Dir.chrootはしないですし)、プロセスIDを記述したロック
ファイルは生成してくれたりはしない、というのが違いでしょうか
(ちなみに権限の切り替え等についてはレシピ本ではp.334の
「ユーザID・グループIDを切り替える」で説明しています)。

exitではなくexit!を使うこととか、$DEBUGの役割などは
レシピ本の本文で説明されておりますので、よろしければ
お読みくださいませ。

高橋征義 (TAKAHASHI Masayoshi)   E-mail: maki / rubycolor.org