2015-03-02 36 views
1

我的ruby腳本創建了一個臨時文件併產生了一個潛在的長時間運行的外部進程。無論腳本終止的方式如何,腳本結束後都不會繼續存在。在ruby腳本之後進行清理 - 捕獲信號

我想下面的行會照顧的事情:

stderr = File.open(Tempfile.new(__FILE__),'w') 
trap("EXIT") { FileUtils.rm_f stderr.path } 
pid = spawn("dd", *ARGV, STDERR => stderr) 
trap("EXIT") { FileUtils.rm_f stderr.path; Process.kill pid } 

他們應該是以下的bash代碼,這似乎是做工精細的重寫,

dd_output=`mktemp` 
trap "rm -f $dd_output" EXIT 
dd "[email protected]" 2>| $dd_output & pid=$! 
trap "rm -f $dd_output; kill $pid" EXIT 

但他們沒有。 如果稍後發生異常,生成的過程不會死亡,否則它會。

有人能告訴我我做錯了什麼嗎?編號: 陷阱確實有效。 上面的代碼有多個瑕疵:

  1. 將它視爲利用了自身的汽車 - 它很可能已經被 在陷阱處理程序,這可能會導致FileUtils.rm_f提高 另一個錯誤,防止刪除。 Process.kill需要一個信號 - Process.kill「TERM」,pid(或「KILL」)。提出的錯誤隱藏了我錯誤地調用Process.kill的錯誤。

固定碼:

stderr = Tempfile.new(__FILE__) 
pid = spawn("dd", *ARGV, STDERR => stderr) 
trap("EXIT") { Process.kill "TERM", pid } 

Ensure工作過。

回答

2

我認爲確保或許能夠在這裏幫到你,它會一直執行裏面的代碼。這與Java的終於相似

stderr = Tempfile.new(__FILE__) 

begin 
    pid = spawn("dd", *ARGV, STDERR => stderr) 
ensure 
    FileUtils.rm_f stderr.path 
    Process.kill pid 
end 

如果不這樣做,你可以嘗試添加at_exit處理器的伎倆。

+0

'at_exit'可能是第一個嘗試在這裏。 – tadman 2015-03-02 23:20:31