在Ruby中创建临时文件?
我使用的是Ruby 1.8.7(2010-12-23 patchlevel 330)[x86_64-linux] 当尝试使用tempfile gem创建临时文件时,它被卡住了,我无法退出:在Ruby中创建临时文件?,ruby,linux,Ruby,Linux,我使用的是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") 在最后一行之后,它卡住了,没有响应 我认为它适用于较新的Rub
1.8.7 :003 > require 'rubygems'
1.8.7 :004 > require 'tempfile'
1.8.7 :005 > tmp_file = Tempfile.new("new_file")
在最后一行之后,它卡住了,没有响应
我认为它适用于较新的Ruby版本,但是有人知道是什么导致了这个问题吗 不进行深入的调试就很难找到问题。尝试运行:
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
类临时文件
def初始化(basename,tmpdir=Dir::tmpdir)
如果$SAFE>0且tmpdir.trainted?
tmpdir='/tmp'
结束
锁定=零
n=故障=0
开始
将“进入关键阶段”
Thread.critical=true
开始
tmpname=File.join(tmpdir,maketmpname(basename,n))
lock=tmpname+'.lock'
n+=1
放n
在@@cleanlist时结束。包括?(tmpname)或
File.exist?(锁定)或File.exist?(tmpname)
目录mkdir(锁)
#拯救
#故障+=1
#如果失败,请重试 @@清除列出$SAFE
和Dir::tmpdir
?$SAFE=0和Dir::tmpdir r=“/tmp”Try:Tempfile.new('new_file',file.expand_path('.'))
。没有帮助。。还是同样的问题好吧,接下来的一组问题是:Tempfile::MAX_TRY
,你得到了什么?另外,如果运行File.exist?('/tmp/anywhere')
(简单的检查,但值得一试),会发生什么情况。同时尝试设置Tempfile::MAX_try=0
,看看是否有任何变化。我用strace运行了它,它一直告诉我:stat(“/tmp/thistmpfile.lock”,0x7fff20e80070)=-1 enoint(没有这样的文件或目录)stat(“/tmp/thistmpfile”,{st_mode=S|IFREG | 0600,st_size=0,…) = 0@gal-加载上述代码后是否运行了它Tempfile.new
它最多会抛出一个错误。@gal-这不是我自己写的代码,这是Ruby 1.8.7补丁330的Tempfileinitialize
方法的实现,我相信这是您的ruby版本?在您的命令行类型gem中,哪个tempfile
-它将为您提供一个指向“tempfile.rb”文件的路径。我发现有人手动编辑了该文件并放入:tmpname='/tmp/thistempfile',它导致了无休止的循环:(