Ruby 不会删除由resque worker创建的临时文件

Ruby 不会删除由resque worker创建的临时文件,ruby,resque,Ruby,Resque,我测试了这个简单的工作,由一个普通的resque工作人员执行 class Jobs::TestTempfile @queue = :test def self.perform Tempfile.open('foo') do |f| puts f.path end end end 创建的临时文件在作业结束后,甚至在工作人员被终止后仍然保留(kill-QUIT pid) 我知道最好的做法是取消链接并关闭所有Tempfiles,但这似乎是个问题。。。有人知道

我测试了这个简单的工作,由一个普通的resque工作人员执行

class Jobs::TestTempfile
  @queue = :test

  def self.perform
    Tempfile.open('foo') do |f|
      puts f.path
    end
  end
end
创建的临时文件在作业结束后,甚至在工作人员被终止后仍然保留(
kill-QUIT pid

我知道最好的做法是取消链接并关闭所有
Tempfiles
,但这似乎是个问题。。。有人知道这方面的全球解决方案吗?或者,我必须检查所有现有作业才能手动取消链接
Tempfiles

我用ruby 2.1进行了测试(但我肯定
2.0
)和
resque 1.24.1

谢谢

file=Tempfile.new('foo')放置file.path


解释器退出后,将执行相同的操作并删除临时文件。

从我的GitHub答案复制此文件:

阅读Tempfile文档:

当一个Tempfile对象被垃圾收集时,或者当Ruby解释器退出时,其关联的临时文件被垃圾收集 自动删除。这意味着,使用后不必显式删除Tempfile,尽管这很好 做法:不明确删除未使用的临时文件可能会在服务器上留下大量临时文件 直到文件系统被垃圾回收为止。这些临时文件的存在会使确定临时文件变得更加困难 新的临时文件名

GC可能永远不会在workers的生命周期中运行,这会将所有临时文件留在那里。在
::perform
方法末尾取消链接可能是您的最佳做法

您还可以执行以下操作:

class JobWithTempfiles
  class << self

    def new_tmpfile(name)
      file = Tempfile.new(name)
      @tmp_files ||= []
      @tmp_files << file
    end

    def perform_with_tmpfile_cleanup
       begin
         perform_without_tmpfile_cleanup
       ensure
         @tmp_files.each do |tmpfile|
           tmpfile.close
           tmpfile.unlink
         end
       end
     end
     alias_method_chain :perform, :tmpfile_cleanup
   end
end

class JobNeedingATmpFil < JobWithTempfiles
  def self.perform_without_tempfile_cleanup
    tmp_file = new_tmpfile("foo")
    # Do a bunch of stuff
  end
end
class JobWithTempfiles

类I不与Resque worker一起工作。我用你的语法测试了我的工作,结果是一样的。即使你杀死了这个工人,临时文件仍然存在?