红宝石脚本后清理-捕获信号

PSkocik

我的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

但是他们没有。如果以后引发异常,则生成的进程不会死亡,否则会死亡。

谁能告诉我我在做什么错?

编辑:陷阱确实有效。上面的代码有多个缺陷:

  1. 临时文件本身就占了上风-可能已在陷阱处理程序中删除了它,这可能导致FileUtils.rm_f引发另一个错误,从而阻止了该错误。
  2. 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 也可以。

耶稣卡斯特罗

我认为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] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

在纯红宝石脚本中使用宝石(不是Rails)

来自分类Dev

如何在Rust中捕获信号

来自分类Dev

捕获信号SIGINT仍会终止程序

来自分类Dev

在bash中捕获来自“ docker stop”的信号

来自分类Dev

在基于Gevent的应用中捕获TERM信号

来自分类Dev

将宝石中的红宝石脚本添加到路径

来自分类Dev

如何在Shell脚本中捕获退出1信号?

来自分类Dev

不捕获红宝石中的命名组

来自分类Dev

我可以在R中捕获信号吗?

来自分类Dev

在Ubuntu中无法捕获SIGPIPE信号

来自分类Dev

正则表达式从红宝石中的非捕获组捕获

来自分类Dev

在多线程环境中捕获信号

来自分类Dev

类型注册后如何在QML信号处理程序中捕获C ++信号?

来自分类Dev

使用pthreads时无法捕获SIGINT信号

来自分类Dev

在脚本中启用作业控制后,为什么不能捕获过程信号?

来自分类Dev

无法在Docker入口点脚本中捕获信号

来自分类Dev

如何在Julia中捕获Linux信号

来自分类Dev

捕获信号时中断系统调用

来自分类Dev

使用块清理红宝石中的地图

来自分类Dev

从QgsMapCanvas发出并捕获双击信号

来自分类Dev

在分组命令中捕获信号

来自分类Dev

我可以在bash脚本中捕获时钟信号吗?

来自分类Dev

红宝石脚本后清理-捕获信号

来自分类Dev

正则表达式从红宝石中的非捕获组捕获

来自分类Dev

红宝石脚本的键盘快捷键

来自分类Dev

获得红宝石潜在捕获物的紧凑方法

来自分类Dev

捕获CTRL- \信号

来自分类Dev

类型注册后如何在QML信号处理程序中捕获C ++信号?

来自分类Dev

红宝石脚本cron不起作用