我的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 "$@" 2>| $dd_output & pid=$!
trap "rm -f $dd_output; kill $pid" EXIT
但是他们没有。如果以后引发异常,则生成的进程不会死亡,否则会死亡。
谁能告诉我我在做什么错?
编辑:陷阱确实有效。上面的代码有多个缺陷:
固定代码:
stderr = Tempfile.new(__FILE__)
pid = spawn("dd", *ARGV, STDERR => stderr )
trap("EXIT") { Process.kill "TERM", pid }
Ensure
也可以。
我认为suresure可能会在这里为您提供帮助,它将始终在其中执行代码。最终与Java的相似。
stderr = Tempfile.new(__FILE__)
begin
pid = spawn("dd", *ARGV, STDERR => stderr )
ensure
FileUtils.rm_f stderr.path
Process.kill pid
end
如果这样不能解决问题,您可以尝试添加at_exit处理程序。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句