我正在使用Ruby 1.8.7(2010-12-23 patchlevel 330)[x86_64-linux]。
当尝试使用tempfile gem创建临时文件时,它会卡住,我无法退出:
1.8.7 :003 > require 'rubygems'
1.8.7 :004 > require 'tempfile'
1.8.7 :005 > tmp_file = Tempfile.new("new_file")
在最后一行之后,它被卡住而没有响应。
我认为它适用于较新的Ruby版本,但是有谁知道什么会导致这个问题?
答案 0 :(得分:0)
它'没有更深入的调试就不容易找到问题。尝试运行:
class Tempfile
def initialize(basename, tmpdir=Dir::tmpdir)
if $SAFE > 0 and tmpdir.tainted?
tmpdir = '/tmp'
end
lock = nil
n = failure = 0
begin
puts 'Entering critcal stage'
Thread.critical = true
begin
tmpname = File.join(tmpdir, make_tmpname(basename, n))
lock = tmpname + '.lock'
n += 1
puts n
end while @@cleanlist.include?(tmpname) or
File.exist?(lock) or File.exist?(tmpname)
Dir.mkdir(lock)
#rescue
# failure += 1
# retry if failure < MAX_TRY
# raise "cannot generate tempfile `%s'" % tmpname
ensure
Thread.critical = false
puts 'critical stage left'
end
@data = [tmpname]
@clean_proc = Tempfile.callback(@data)
ObjectSpace.define_finalizer(self, @clean_proc)
@tmpfile = File.open(tmpname, File::RDWR|File::CREAT|File::EXCL, 0600)
@tmpname = tmpname
@@cleanlist << @tmpname
@data[1] = @tmpfile
@data[2] = @@cleanlist
super(@tmpfile)
Dir.rmdir(lock)
end
end
这应该与您的Tempfile initialize
方法相同,并带有一些调试位。你可以运行它,然后重试创建一个新的临时文件。当您使用控制台输出发表评论时,我会更新答案。