2014-01-13 8 views
2

일반 작업자에 의해 실행되는 간단한 작업을 테스트했습니다. 생성resque 작업자가 만든 임시 파일은 삭제되지 않습니다.

class Jobs::TestTempfile 
    @queue = :test 

    def self.perform 
    Tempfile.open('foo') do |f| 
     puts f.path 
    end 
    end 
end 

임시 파일은 작업의 종료 후 남아 있고 노동자는 (kill -QUIT pid) 종료 된 경우에도 한 번.

내가 최선의 방법은 모두 연결을 끊고 모든 문제를 해결하는 것입니다. 그러나 이것은 문제가되는 것처럼 보입니다.이 문제에 대해 알고있는 사람이 있습니까? 또는 기존 작업을 모두 거쳐 수동으로 연결을 해제해야합니까 Tempfiles.

나는 ruby 2.1으로 테스트했지만 (긍정적 인 문제는 2.0으로 존재 함), resque 1.24.1으로 테스트했습니다.

감사합니다.

답변

0

파일 = Tempfile.new ('푸')

가 동일하게 작동하고 인터프리터 종료하면 임시 파일을 삭제 file.path를 넣습니다.

+0

나는 Resque 노동자와 함께 작동하지 않습니다

또한 뭔가를 할 수 있습니다. 내 Job을 신텍스로 테스트했는데 결과물은 같습니다. – Such

+0

작업자를 죽인 후에도 임시 파일이 남아 있습니까? – Giannis

+0

예, 심지어 작업자가 사망 한 후에도! – Such

0

내 GitHub의 대답에서이 복사 다음 임시 파일 문서를 읽기

:

임시 파일 객체가 쓰레기 수집 할 때, 또는 루비 인터프리터 종료는 관련 임시 파일은 자동으로 삭제됩니다. 즉, 사용 후 Tempfile을 명시 적으로 삭제하는 것은 불필요합니다. 사용하지 않는 Temp 파일을 명시 적으로 삭제하지 않으면 파일 시스템에 많은 양의 임시 파일이 남을 수 있습니다. 이러한 임시 파일의 존재로 인해 새 임시 파일 이름을 결정하기가 더 어려워 질 수 있습니다.

GC는 근로자의 평생 동안 실행되지 않을 수 있습니다. 그러면 GC가 모든 임시 파일을 그대로 남겨 둘 수 있습니다. ::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