问题标签 [popen3]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
1 回答
76 浏览

ruby - 在 ruby​​ 中使用 Open3 执行 top 命令

我正在尝试使用 ruby​​ 中的 Open3 模块在 ruby​​ 中执行“top -n 1”命令。

这是我的代码

我得到的只是NOPE。即使我尝试打印o.read或者o.gets我得到的只是一个空行。

无论如何我可以使用 open3 来执行该命令吗?还有其他执行方式吗?难道我做错了什么?

我看到我可以使用反引号(`)来执行系统命令。这是一个好习惯吗?我看到几篇文章和博客说不是。

提前致谢。

0 投票
2 回答
187 浏览

ruby - Ruby 运行外部程序停止脚本

我有一个 ruby​​ 脚本,中途我需要它来运行另一个程序。

运行程序后,脚本的其余部分不会运行。例如:

我也尝试过使用Open3.popen2e(cmd)Open3.popen3(cmd)但它是一样的。

谁能帮我理解这里发生了什么以及如何解决它?

注意:我使用的是窗户

0 投票
2 回答
389 浏览

ruby - Thor:在不捕获 stdout 或 stderr 的情况下运行命令,并因错误而失败

我正在编写一个 Thor 脚本来从不同的工具运行一些测试,即运行一个 shell 命令。我希望命令中的 stdout 和 stderr 不断流入我的控制台。

第一次尝试是只使用反引号,但自然不会打印标准输出/标准错误(相反,标准输出被捕获在返回值中)。

我的下一个方法是使用 Open3,如下所示:

但是,上述方法将从 stdout 和 stderr 获得全部输出,并且仅在最后打印。在我的用例中,我宁愿看到失败和通过测试的输出,因为它变得可用。

http://blog.bigbinary.com/2012/10/18/backtick-system-exec-in-ruby.html,我看到我们可以按块读取流,即使用gets()而不是read(). 例如:

它看起来是不是最好和最干净的方法?我必须在标准错误之前手动尝试打印标准输出是一个问题吗?

0 投票
1 回答
222 浏览

ruby - Git Hook - Ruby 代码 - 交互式输入

我正在尝试从 git hook 执行代码(commit-msg hook)中获取输入。但是红宝石不能在输入点停止。并且它执行代码就好像输入就像一个 puts 语句。这是我尝试过但失败的代码。

有人请帮助我接受这个交互式输入,或者建议我一种编写 git 钩子的好语言。提前致谢。

0 投票
0 回答
34 浏览

ruby - 将下一个参数传递给“STDIN”

我正在使用 open3 传递STDIN给程序,然后读取和解析STDOUT. e0我的程序需要一个,e1 e2等形式的参数。

每次给出新的论点时,都会STDOUT发生变化。我不知道如何在解析第一个结果后传递下一个参数,这将给出下一个数字作为参数传递。这是我的代码:

下一个参数存储在 中@next_states,可以是一个数字或多个数字。如何使用该数组的元素继续程序的下一部分并再次解析?

0 投票
0 回答
191 浏览

node.js - 当 Ruby 的 popen3 启动 npm install 时,node-sass 模块安装脚本不退出

更新 3:这个问题似乎是 node-sass 模块安装的一部分。搁浅进程的工作目录为./node_modules/node-sass,其命令行scripts/install.js解析为模块内的文件。此外,到达控制台的最后一行输出与 node-sass' 的一行输出相匹配scripts/install.js

此代码在从命令行运行时没有任何问题(即,只需npm install在命令提示符下使用空白node_modules目录发出),但是当npm install通过 启动时popen3,这里的流调用似乎.pipe无限期地阻塞。

这对我来说是一个令人头疼的时刻......

如果我 ^C 是 Ruby 启动这些子进程的终端,则中断会使其进入流氓进程并使其终止。但是,强制关闭所有管道(或简单地终止父进程)不会导致流氓node.exe退出。

我考虑了一个替代版本,popen3它显式等待子进程,而不是仅仅隐式等待流全部结束,但是虽然这确实允许调用方正常进行,但流氓子进程仍然徘徊,并且会通过持有目录的打开句柄来干扰后续调用./node_modules/node-sass

更新4:我已经打开了这个node-sass项目的错误报告:https ://github.com/sass/node-sass/issues/2459


更新:我很确定这实际上是一个节点问题。我找到了挂起的根本原因,它是通过一个复杂的子进程树,npm install最终留下一个实例,node.exe它只是坐在那里,显然是无限期地,什么都不做,保持它继承的stdout和管道打开。stderr

所以,这留下了新的问题:

  1. 有没有办法让 Node在完成后不会留下一个落后的进程npm install
  2. 有没有办法显式等待直接子进程popen3退出,而不是等待流结束,然后可能从侦听端关闭流以终止泵送输出的线程?

更新2:我已经用这个极简代码重现了这个问题:

使用此代码,流氓node.exe进程(命令行scripts/install.js:)在npm install完成后挂起。终止进程会解除阻塞popen3调用(通过导致stdout结束,因此each_line循环终止),并且 ^Cing Ruby 代码(在 IRB 窗口中运行时)会导致流氓node.exe终止(在控制台输出中的一行之后=> #<IO:(closed)>:) .

这仅在进程运行时发生popen3;CMD 提示符中的相同npm install内容正常退出。


原始问题:

popen3在 Ruby 脚本中遇到问题。它挂了,但我很确定它不是任何通常的候选人。我已经popen3用大量注释更新了我的调用,以便我可以在控制台输出中看到正在发生的事情。这是我打电话的方式:

(别管究竟Logger.log是什么;只要知道它将输出发送到控制台。)

我看到问题的地方command_w_params等于npm install,并且此代码在bundle exec rake TaskName.

当它到达此代码时,我看到以下控制台输出:

...然后它就挂起。此时,我可以在 Process Explorer 中看到子进程已退出。除了 之外什么都没有ruby.exe,但它只是无限期地坐在那里,直到它被明确取消。这两个线程仍在运行,表明stdoutstderr流尚未发出流结束信号。

现在,通常当人们popen3对. 但是我的代码使用单独的线程并保持管道缓冲区为空。stdoutstderr

我看到的另一个问题是子进程可能一直在等待stdin关闭,但在这种情况下:

  • stdin 正在关闭。
  • 子进程甚至不再存在。

有人认识这些症状吗?为什么子进程退出时stdoutstderr流没有达到流尾?

0 投票
0 回答
224 浏览

ruby - Ruby popen3 - 如何防止重复写入标准输入导致超时?

目前,当标准输出为我提供最后一个行标记“EE\n”时,我正在循环写入标准输入。现在它应该一直持续到循环终止,但由于某种原因,stdout 在迭代 625 等处没有提供任何新行,我认为问题在于 stdin 没有监听或捕获新的 put。

我试过用 PTY.spawn 而不是 Open3.popen3 来做,但没有运气。此外,我在期望中设置了一个超时,当这种情况发生时再次写入标准输入。我从这篇文章中得到了保持标准输入打开的想法: ruby popen3 -- 如何在不重新打开进程的情况下重复写入标准输入和读取标准输出?

我需要保持标准输入打开,因为下一步将是标准输出为标准输入等提供新信息。

所以这段代码最终打印出 625 ,这意味着 625 成功stdin.puts "e0"。但它应该一直持续下去,直到出现一些用户干扰,例如ctrl c.

解决方案

我没有从 stderr 读取导致完整的管道,现在我使用 popen2。

0 投票
1 回答
427 浏览

ruby - 在 Ruby 中运行多线程 Open3 调用

我有一个大循环,我试图Open3.capture3在线程中运行调用而不是线性运行。每个线程都应该独立运行,并且在访问数据方面没有死锁。

问题是,线程版本慢得多,它占用了我的 CPU。

下面是一个线性规划的例子:

这是线程版本:

时间比较:

0 投票
1 回答
205 浏览

ruby - 两者都实时获取 STDOUT 并提供 STDIN

我有一个命令需要我给它一些 STDIN 数据,如my-command <<< my-data. 我无法控制命令;该信息旨在以交互方式提供并且<<<有效。

我想将此命令作为更大脚本的一部分自动执行,但由于它的操作需要一段时间——但会将进度输出到 STDOUT——我想实时打印 STDOUT。我还希望能够捕获命令的退出状态,以确定它是否失败。

如果我使用system,我会在发生时得到 STDOUT,但无法提供 STDIN 数据。

如果我使用Open3,我可以提供 STDIN 数据,但 STDOUT 仅在最后打印(如果我完全捕获它)。

任何方式我都可以两全其美,最好是Open3

0 投票
1 回答
175 浏览

ruby - 使用 popen3 实时输出 rake 任务

popen3在获得实时输出的同时从块内运行 rake 任务似乎是不可能的。所有行在 rake 任务结束时立即出现。popen3我正在尝试通过一个块从 rake 任务中获取实时输出

如何重现

概念证明:rake 任务

  1. 创建任务如下
  1. 从命令行调用任务

$ rake print_and_wait输出 3 行(A、B 和 C),中间停顿一秒。正如预期的那样

概念证明 2:popen3

  1. 创建一个shell脚本
  1. 创建一个红宝石脚本
  1. 运行红宝石脚本

$ ruby print_and_wait.rb按预期工作:输出 3 行,中间停顿一秒

它不起作用的地方

  • 编辑 ruby​​ 脚本 print_and_wait.rb 并更改exec_async './print_and_wait'exec_async 'rake print_and_wait'
  • $ ruby print_and_wait.rb
  • 没有输出,3 秒后所有 3 行同时打印

我尝试了几种组合,但始终无法使其按预期工作。知道为什么这不起作用吗?这是一个错误吗?

谢谢