Ruby 守护进程仍然可以打印到标准输出吗?

Ruby 守护进程仍然可以打印到标准输出吗?,ruby,daemon,Ruby,Daemon,我正在Ruby 1.8.7中使用双fork+setsid编写一个守护进程(即,没有Process.daemon): exit if fork Process.setsid exit if fork 在这一切之后,出于某种原因,我似乎仍然能够打印到标准输出。从我所读到的一切来看,守护进程不应该有一个控制终端,并且对stdout的写入不应该做任何事情。但是,如果我以以下方式跟进上述内容: puts "Hello world" “Hello world”将打印到屏幕上。这是预期的行为吗?是的,我相

我正在Ruby 1.8.7中使用双fork+setsid编写一个守护进程(即,没有Process.daemon):

exit if fork
Process.setsid
exit if fork
在这一切之后,出于某种原因,我似乎仍然能够打印到标准输出。从我所读到的一切来看,守护进程不应该有一个控制终端,并且对stdout的写入不应该做任何事情。但是,如果我以以下方式跟进上述内容:

puts "Hello world"

“Hello world”将打印到屏幕上。这是预期的行为吗?

是的,我相信这是预期的。调用
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("/")