在 ruby​​ 中杀死一个名为 using open3 的进程

2023-12-21

我正在使用命令行程序,它的工作原理如下:

$ ROUTE_TO_FOLDER/app < "long text"

If “长文本”使用参数编写"app"需要,那么它将用结果填充一个文本文件。如果没有,它将连续用点填充文本文件(我无法处理或修改“app”的代码以避免这种情况)。

在 ruby​​ 脚本中有这样一行:

text = "long text that will be used by app"
output = system("ROUTE_TO_FOLDER/app < #{text}")

现在,如果文本写得好,就不会有问题,我将得到前面提到的输出文件。当文本写得不好时,问题就会出现。接下来发生的事情是我的 ruby​​ 脚本挂起,我不知道如何杀死它。

我发现了Open3 http://www.ruby-doc.org/stdlib-1.9.3/libdoc/open3/rdoc/Open3.html#method-c-popen3我使用了这样的方法:

irb> cmd = "ROUTE_TO_FOLDER/app < #{text}"
irb> stdin, stdout, stderr, wait_thr = Open3.popen3(cmd)
=> [#<IO:fd 10>, #<IO:fd 11>, #<IO:fd 13>, #<Thread:0x007f3a1a6f8820 run>]

当我做:

irb> wait_thr.value

它也挂起,并且:

irb> wait_thr.status
=> "sleep"

我怎样才能避免这些问题?是不是没有意识到“app”失败了?


wait_thr.pid为您提供已启动进程的 pid。做就是了

Process.kill("KILL",wait_thr.pid)

当你需要杀死它的时候。

您可以将其与以两种方式之一检测进程是否挂起(连续输出点)结合起来。

1)设置等待进程的超时时间:

get '/process' do
  text = "long text that will be used by app"
  cmd = "ROUTE_TO_FOLDER/app < #{text}"
  Open3.popen3(cmd) do |i,o,e,w|
    begin
      Timeout.timeout(10) do # timeout set to 10 sec, change if needed
        # process output of the process. it will produce EOF when done.
        until o.eof? do
          # o.read_nonblock(N) ...
        end
      end
    rescue Timeout::Error
      # here you know that the process took longer than 10 seconds
      Process.kill("KILL", w.pid)
      # do whatever other error processing you need
    end
  end
end

2) 检查过程输出。 (下面的代码经过简化 - 您可能不想先将进程的输出读入单个 String buf 然后再进行处理,但我想您已经明白了)。

get '/process' do
  text = "long text that will be used by app"
  cmd = "ROUTE_TO_FOLDER/app < #{text}"
  Open3.popen3(cmd) do |i,o,e,w|
    # process output of the process. it will produce EOF when done. 
    # If you get 16 dots in a row - the process is in the continuous loop
    # (you may want to deal with stderr instead - depending on where these dots are sent to)
    buf = ""
    error = false
    until o.eof? do
      buf << o.read_nonblock(16)
      if buf.size>=16 && buf[-16..-1] == '.'*16
        # ok, the process is hung
        Process.kill("KILL", w.pid)
        error = true
        # you should also get o.eof? the next time you check (or after flushing the pipe buffer),
        # so you will get out of the until o.eof? loop
      end
    end
    if error
      # do whatever error processing you need
    else
      # process buf, it contains all the output
    end
  end
end
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

在 ruby​​ 中杀死一个名为 using open3 的进程 的相关文章

  • 如何使用 Nokogiri 获取某些标签之后或之前的文本

    我有一个 HTML 文档 如下所示
  • 如何将两个不同的哈希数组中的值添加在一起?

    我有两个哈希数组 哈希值的键不同 player scores1 first name gt Bruce score gt 43 time gt 50 first name gt Clark score gt 45 minutes gt 20
  • Ruby 未绑定方法:是否可以强制绑定到其他类的实例?

    我想知道我是否可以强迫这种情况发生 class A def bomb bomb end end class B end bomb A instance method bomb b B new bomb bind b 目前它抛出错误 Type
  • sleep 0 有特殊含义吗?

    我看到很多用法sleep 0在我的一个客户项目中 代码看起来像这样 while true sleep 0 end 阅读一些像这样的答案this https stackoverflow com questions 3727420 signif
  • 如何使 Rails 3 资源预编译速度更快?

    我有一个正在运行的 Rails 3 2 1 应用程序 我正在通过 Capistrano 进行部署deploy assets它运行deploy assets precompile task 一切工作都很好 除了编译本身非常慢 我没有那么多 C
  • Ruby 中多维数组的帮助

    我有以下代码将字符串拆分为 3 个字节的组 str hello ix 0 iy 0 bytes tby str each byte do c if iy 3 iy 0 bytes ix tby each index do i bytes i
  • Rails 4 - 如何链接到 PDF 文件(名称.PDF)?

    我正在生成 PDF 文件 我的链接如下所示 当我点击这个时 它会带我去 display invoice 123456789 这是一个 HTML 版本 在控制器中的操作如下 def display invoice if params invo
  • Rails:CSRF 令牌不工作但已设置

    我在 Heroku 上有我的 Rails 3 应用程序 当我发送银行信息时 我得到 WARNING Can t verify CSRF token authenticity但我的 CSRF 令牌已设置 https gist github c
  • 如何向 Time.now 添加两周?

    如何在 Ruby 中向当前 Time now 添加两周 我有一个使用 DataMapper 的小型 Sinatra 项目 在保存之前 我有一个字段填充了当前时间加上两周 但未按需要工作 任何帮助是极大的赞赏 我收到以下错误 NoMethod
  • Rails 控制台无法运行

    rbenv 红宝石版本 2 6 6 导轨版本 5 1 4 我正在较旧的代码库中工作 ruby 2 6 6 rails 5 4 1 这是我每天使用的代码库 我必须通过 rbenv 下载一个新的 ruby 版本作为单独的存储库 这样做在我的旧代
  • Heroku 部署错误

    在 Windows 环境中 尝试部署到 Heroku 时出现以下错误 C Ruby lib ruby gems 1 8 gems heroku 1 9 13 lib heroku commands base rb 32 in 没有这样的文件
  • 多重要求和允许强参数rails 4

    在下面的情况下 我尝试使用强参数 我想要求email address password并允许remember me fields 但像下面这样使用它只允许最后一行在方法示例中 在下面的情况下 它只需要params permit rememb
  • Rails:named_scope、lambda 和块

    我认为以下两个是等效的 named scope admin lambda company id conditions gt company id company id named scope admin lambda do company
  • 用户未定义的方法 attr_accessible 错误

    我正在尝试创建某种登录 我创建了一个用户脚手架并将此代码放在我的 user rb 中 class User lt ActiveRecord Base attr accessible name password digest password
  • ruby从1.8.7升级到1.9.2(使用Rails 3.1.1)后本地服务器错误

    我刚刚安装了rvm并使用rvm将ruby从1 8 7升级到1 9 2 我在我的应用程序上运行了捆绑安装 它重新安装了我的 gems 当我在本地运行 Rails 服务器并将浏览器导航到 localhost 3000 时 服务器日志中显示以下错
  • Ruby 是否有一个 Expect 等效 gem?

    Ruby 是否有一个 Expect 等效 gem 我尝试在 code google 和 ruby gems org 上搜索 但遗憾的是它没有出现 FYI Expect http en wikipedia org wiki Expect是一个
  • 什么是适合 Rails 3 的测试框架?

    去年我一直在使用 Ruby On Rails 但是 无法进行单元测试 现在我必须编写单元测试代码 哪个测试框架好 为什么 有这方面的好的教程吗 我的系统配置 Ruby 1 9 2 Rails 3 Ubuntu 10 第一个技巧是 尝试升级到
  • 为 RoR 中的每个用户创建新的 URL 路径

    如何在 Ruby on Rails 中实时创建新的 URL 路径 例如 我希望我的用户拥有 name XXX com 或 XXX com name 仅供参考 我在 Heroku 上托管代码 看看 subdomain fu 插件 https
  • 在 Sinatra 中运行后台进程

    我有 Sinatra Rails 应用程序和一个启动一些漫长过程的操作 通常我会为后台作业排队 但这种情况太简单了 后台进程很少启动 所以队列是一个开销 那么如何在没有队列的情况下运行后台进程呢 get build logs project
  • 使用 ruby​​ 调整动画 GIF 图像的大小?

    我正在尝试将 GIF 图像调整为不同的尺寸 我在 ruby 中使用 RMagick 库 但对于某些 gif 图像 即使我缩小 GIF 的大小 文件大小似乎也会增加 我正在以相同的纵横比调整图像图像的大小 这是我的代码 require rma

随机推荐

  • Git 克隆、推送和拉取都挂起,没有消息

    直到昨天 git在我的电脑上完美运行 现在 每当我尝试推送 拉取或克隆存储库时 git 都会挂起 我已经尝试过 SSH 和 HTTPS 与围绕此问题发布的许多其他 StackOverflow 问题不同 我的操作在同一早期阶段挂起 例如 运行
  • 如何在 Bazel 中静态链接系统库?

    如何在大多数静态模式下静态链接系统库 linkstatic 1 我尝试使用 Wl Bstatic lboost thread Wl Bdynamic 或 Wl Bstatic lboost thread Wl Bdynamic 但它们都不起
  • 不可见字符 - ASCII

    有没有无形的人物 我已经在谷歌上检查了隐形字符 最终得到了很多答案 但我不确定这些答案 Stack Overflow 上的人可以告诉我更多相关信息吗 我还检查了 Facebook 上的个人资料 发现该用户的个人资料中没有任何姓名 这怎么可能
  • 从 aws cloudformation 描述堆栈获取输出

    我正在使用下面的方法来获取堆栈信息 http docs aws amazon com cli latest reference cloudformation describe stacks html我想通过 AWS Cli aws clou
  • 对带有&不带重定向的“mysql -e”输出格式有点好奇

    说我跑步的时候mysql u user p e select id from db users limit 1 I got id 8434 当我将输出 标准输出重定向到某个文件时 例如mysql u user p e select id f
  • 写入 webroot 目录之外的文本文件

    我正在尝试使用 PHP 读取和写入文本文件 使用 html 页面上的按钮读取文件 该文件是使用 html 页面上的按钮编写的 该按钮从文本框中获取参数 当文本文件位于 webroot 目录中时 我成功写入文本文件 我希望能够读取 写入位于
  • 如何检测 jQuery 触发事件完成?

    我试图触发依赖于第一个事件的第二个事件 如下所示 productFamilyId val data contents productfamily productFamilyId trigger change function product
  • 使用起订量和 TDD,从哪里开始?

    我有一个服务器应用程序 我想知道如果我想开始实施 TDD 并使用 Moq 我应该从哪里开始 我可以读哪些关于这个主题的好书 而且不太 面向网络 我对此事有疑问 例如 我应该模拟我想要测试的每个对象 还是只模拟那些我无法实现的对象 例如文本编
  • 如何在 R 中添加副标题并更改 ggplot 图的字体大小?

    我尝试使用添加字幕 opts subtitle text 但什么也没有出现 主标题确实有效 opts title text 我还想为轴 标签和坐标 使用更大的字体 但我不知道该怎么做 theme get 将向您显示可以使用的 隐藏 选项op
  • UnboundLocalError:局部变量...在赋值之前引用[重复]

    这个问题在这里已经有答案了 import hmac base64 hashlib urllib2 base https def makereq key secret path data hash data path chr 0 data s
  • 未捕获的类型错误:数据[选项]不是函数 bootstrap.js:1215

    我使用 bootstrap lightbox 时收到以下错误here http ashleydw github io lightbox Uncaught TypeError data option is not a function boo
  • 模拟 Photoshop 的“色彩范围”算法

    我正在尝试用在服务器上完成的自动过程来替换在 PhotoShop 中完成的手动过程 目前 在 PhotoShop 中 颜色范围 工具用于使用 模糊度 系数来选择一系列颜色 并根据处理的部分从黑色或白色开始 我最初的方法包括使用 L a b
  • Midas/DataSnap 项目中的 DUnit 测试

    如何在 Delphi 2006 的 Midas DataSnap 项目中设置 DUnit 测试 Edit 如何在 TRemoteDataModule 中设置 Dunit 测试 Delphi 2006 中的项目向导不适用于 TRemoteDa
  • @XmlRootElement 和 抛出 IllegalAnnotationExceptions

    当我编组此类的实例时 XmlRootElement public static class TestSomething
  • AWS DynamoDB 始终面向互联网

    Question 试图找到一种将 DynamoDB 放入 VPC 中的方法 但目前尚未找到 对于 Lambda 它可以位于具有来自 VPC 子网的 IP 的 ENI 的 VPC 内 然后 Lambda 在没有 NAT 的情况下没有任何互联网
  • NEAT:指定

    我试图自己使用原始论文来实现整洁 但被卡住了 假设在上一代我有以下物种 Specie 1 members 100 avg score 100 Specie 2 members 150 avg score 120 Specie 3 membe
  • 装饰器不支持函数调用,但调用了“FileTypeModule”

    尝试设置ngx formly material 文件 https github com alEX860111 ngx formly material file 但我得到一个错误 装饰器不支持函数调用 但调用了 FileTypeModule
  • Android的RelativeLayout似乎坏了

    我正在开发一个布局 其中使用带有RelativeLayout 行项目的ListView 行项目本身无法正确显示 问题是 txtVideoDuration TextView 绘制在行项目的顶部而不是底部 因此 txtVideoTitle 的高
  • 我什么时候应该使用 C# 的 LINQ? [关闭]

    Closed 这个问题是基于意见的 help closed questions 目前不接受答案 我正在学习 C 我发现 LINQ 非常有趣 然而 令我困惑的是 我想不出使用 LINQ 会有巨大帮助的场景 因为在代码中复制 LINQ 功能实际
  • 在 ruby​​ 中杀死一个名为 using open3 的进程

    我正在使用命令行程序 它的工作原理如下 ROUTE TO FOLDER app lt long text If 长文本 使用参数编写 app 需要 那么它将用结果填充一个文本文件 如果没有 它将连续用点填充文本文件 我无法处理或修改 app