[#39699] デーモン・プロセスの作り方 — "Mitsuyasu Ichimura" <mitsuyasu@...>

こんにちは、市村と申します。

27 messages 2004/06/01
[#39710] Re: デーモン・プロセスの作り方 — Masayoshi Takahashi <maki@...> 2004/06/01

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

[#39711] Re: デーモン・プロセスの作り方 — nobu.nakada@... 2004/06/01

なかだです。

[ruby-list:39734] Re: デーモン・プロセスの作り方

From: GOTOU Yuuzou <gotoyuzo@...>
Date: 2004-06-03 19:00:51 UTC
List: ruby-list #39734
In message <20040603224656.0575a41b.tommy@tmtm.org>,
 `とみたまさひろ <tommy@tmtm.org>' wrote:
> # ああ、買わないとなあ…。268 ってのがビミョー。256 ならキリがよいんだ
> # けど…。

この微妙に引っかかる所がいいような気がしてきました:-)

> > ↓こんな感じです。
> > 
> >   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

> ところで、私は $stdin/$stdout/$stderr を使ってるんですが、そうじゃなく
> て STDIN/STDOUT/STDERRを使う方が好ましいのでしょうか。

まず、デーモンプロセスの入出力の扱いについて、神戸さんが
[ruby-list:39717]でおっしゃっていることに全面的に同意します。

IO#reopenは、IOが保持しているディスクリプタを同じ値を保った
まま開き直します。上記のコードではforkの後にexecやsystemを呼
んだ場合にも標準入出力が/dev/nullを向いていることを期待して
います。

一方、$stdin/$stdout/$stderrはgets、print、warnなど、Rubyレ
ベルでのデフォルトの入出力先を「代入することによって」切替え
るためのインターフェースです。これらが、すでに置き替えられて
いる場合は、reopenしてもプロセスのレベルで標準入出力が切り替
わるわけではありませんから、ここではSTDIN/STDOUT/STDERRを使
うのが好ましいと考えています。

-- 
ごとうゆうぞう

In This Thread