gpt4 book ai didi

ruby - ruby 脚本后清理—捕获信号

转载 作者:行者123 更新时间:2023-12-03 07:42:04 25 4
gpt4 key购买 nike

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

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

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

编辑:
陷阱可以工作。
上面的代码有多个缺陷:
  • Tempfile本身就是汽车-可能已经
    在陷阱处理程序中删除,这可能导致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也可以。

    最佳答案

    我认为确保可能在这里为您提供帮助,它将始终在其中执行代码。它与Java的最后是相似。

    stderr = Tempfile.new(__FILE__)

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

    如果这样不能解决问题,您可以尝试添加 at_exit 处理程序。

    关于ruby - ruby 脚本后清理—捕获信号,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28820552/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com