守护进程仍然可以打印到stdout?

时间:2013-08-28 21:53:41

标签: ruby daemon

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

exit if fork
Process.setsid
exit if fork

在完成所有这些之后,我仍然出于某种原因,似乎能够打印到stdout。从我读过的所有内容来看,守护进程不应该有一个控制终端,写入stdout不应该做任何事情。但是,如果我用以下内容跟进上述内容:

puts "Hello world"

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

1 个答案:

答案 0 :(得分: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("/")