1

我正在使用双叉+setsid在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 回答