2015-03-02 74 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