1

ダブルフォーク+セットIDを使用して、Ruby 1.8.7(つまり、Process.daemonなし)でデーモンを作成しています。

exit if fork
Process.setsid
exit if fork

このすべての後、何らかの理由で、標準出力に出力できるようです。私が読んだすべてから、デーモンプロセスには制御端末がなく、標準出力への書き込みは何もすべきではありません。ただし、上記をフォローアップすると、次のようになります。

puts "Hello world"

「Hello world」が画面に出力されます。これは予想される動作ですか?

4

1 に答える 1

0

はい、これは予想通りだと思います。を呼び出しProcess.setsidても、開いているファイル記述子は閉じられません/dev/null。たとえば、次のように手動で再度開く必要があります。

io = File.open("/dev/null", "w+")

exit if fork
Process.setsid
exit if fork

$stdin.reopen(io)
$stdout.reopen(io)
$stderr.reopen(io)

または、出力が気になる場合は、ログ ファイルを使用して stdout と stderr を再度開くことができます。

/また、存在しないディレクトリでデーモンが実行されないように、作業ディレクトリを次のように変更することをお勧めします。

Dir.chdir("/")
于 2013-08-28T23:14:17.237 に答える