GC不清理(是:Tempfile没有自动删除,Ruby)

时间:2009-09-05 22:07:52

标签: ruby configuration

Ruby tempfile实例在发布引用时自动删除其相应的文件。但是,我有一台机器不是这种情况。代码是

irb> require 'tempfile'
=> true
irb> t = Tempfile.new('test32')
=> #<File:/tmp/test32.27778.0>
irb> exit

在我的所有测试机器上,这导致test32被删除,除了一个。我试图使用File.delete删除文件,不幸的是,它工作正常。我缺少一些ruby配置吗?

Ruby版本

ruby 1.8.6 (2009-06-08 patchlevel 369) [i686-linux].

编辑:在与DigitalRoss的对话中发现的一些其他信息:如果我明确发布Tempfile引用(t = nil),则会清除Tempfile。 GC是否可能以某种方式修补或更改?

这里有一些适用于“好”机器的代码,但是在“坏”机器上却失败了

include ObjectSpace
t = "blah"
define_finalizer(t, proc {|id| print "yes finalized id=#{id}", "\n" })

在糟糕的机器上,如果我明确地将t设置为nil,则仅打印“yes finalized”。

2 个答案:

答案 0 :(得分:2)

好的,继续问题的评论主题......

Ruby,或者真的,Tempfile,使用垃圾收集器来管理终结器。 (我假设它以这种方式工作而不是通过Kernel :: at_exit以便在长时间运行的ruby中删除文件。)无论如何,在一个系统上GC的某些东西似乎有所不同。让我们试着把它固定下来。试试这个,看看是否清除了对Tempfile实例的唯一引用并启动GC会删除该文件。

ross@deb:~$ irb
>> require 'tempfile'
=> true
>> $DEBUG=true
=> true
>> t=Tempfile.new('aaa')
=> #<File:/tmp/aaa20090905-21437-1d460as-0>
>> GC.start
=> nil
>> t=nil
=> nil
>> GC.start
removing /tmp/aaa20090905-21437-1d460as-0...done
=> nil
>> exit
ross@deb:~$ 

答案 1 :(得分:1)

在1.8.7中,终结器和垃圾收集器存在问题,听起来很可能是因为你在1.8.6中遇到了同样的问题。

我们设法通过猴子修补Tempfile来修复我们的rails应用程序中的问题。也可能为你工作。代码:http://github.com/jwinky/ruby_tempfile_ioerror