Ruby 不会删除由resque worker创建的临时文件
我测试了这个简单的工作,由一个普通的resque工作人员执行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,但这似乎是个问题。。。有人知道
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一起工作。我用你的语法测试了我的工作,结果是一样的。即使你杀死了这个工人,临时文件仍然存在?