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
但他們沒有。 如果稍後發生異常,生成的過程不會死亡,否則它會。
有人能告訴我我做錯了什麼嗎?編號: 陷阱確實有效。 上面的代碼有多個瑕疵:
- 將它視爲利用了自身的汽車 - 它很可能已經被 在陷阱處理程序,這可能會導致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
工作過。
'at_exit'可能是第一個嘗試在這裏。 – tadman 2015-03-02 23:20:31