问题标签 [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.
ruby - 在 ruby 中使用 Open3 执行 top 命令
我正在尝试使用 ruby 中的 Open3 模块在 ruby 中执行“top -n 1”命令。
这是我的代码
我得到的只是NOPE。即使我尝试打印o.read
或者o.gets
我得到的只是一个空行。
无论如何我可以使用 open3 来执行该命令吗?还有其他执行方式吗?难道我做错了什么?
我看到我可以使用反引号(`)来执行系统命令。这是一个好习惯吗?我看到几篇文章和博客说不是。
提前致谢。
ruby - Ruby 运行外部程序停止脚本
我有一个 ruby 脚本,中途我需要它来运行另一个程序。
运行程序后,脚本的其余部分不会运行。例如:
我也尝试过使用Open3.popen2e(cmd)
,Open3.popen3(cmd)
但它是一样的。
谁能帮我理解这里发生了什么以及如何解决它?
注意:我使用的是窗户
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()
. 例如:
它看起来是不是最好和最干净的方法?我必须在标准错误之前手动尝试打印标准输出是一个问题吗?
ruby - Git Hook - Ruby 代码 - 交互式输入
我正在尝试从 git hook 执行代码(commit-msg hook)中获取输入。但是红宝石不能在输入点停止。并且它执行代码就好像输入就像一个 puts 语句。这是我尝试过但失败的代码。
有人请帮助我接受这个交互式输入,或者建议我一种编写 git 钩子的好语言。提前致谢。
ruby - 将下一个参数传递给“STDIN”
我正在使用 open3 传递STDIN
给程序,然后读取和解析STDOUT
. e0
我的程序需要一个,e1 e2
等形式的参数。
每次给出新的论点时,都会STDOUT
发生变化。我不知道如何在解析第一个结果后传递下一个参数,这将给出下一个数字作为参数传递。这是我的代码:
下一个参数存储在 中@next_states
,可以是一个数字或多个数字。如何使用该数组的元素继续程序的下一部分并再次解析?
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
所以,这留下了新的问题:
- 有没有办法让 Node在完成后不会留下一个落后的进程
npm install
? - 有没有办法显式等待直接子进程
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
,但它只是无限期地坐在那里,直到它被明确取消。这两个线程仍在运行,表明stdout
和stderr
流尚未发出流结束信号。
现在,通常当人们popen3
对. 但是我的代码使用单独的线程并保持管道缓冲区为空。stdout
stderr
我看到的另一个问题是子进程可能一直在等待stdin
关闭,但在这种情况下:
stdin
正在关闭。- 子进程甚至不再存在。
有人认识这些症状吗?为什么子进程退出时stdout
和stderr
流没有达到流尾?
ruby - Ruby popen3 - 如何防止重复写入标准输入导致超时?
目前,当标准输出为我提供最后一个行标记“EE\n”时,我正在循环写入标准输入。现在它应该一直持续到循环终止,但由于某种原因,stdout 在迭代 625 等处没有提供任何新行,我认为问题在于 stdin 没有监听或捕获新的 put。
我试过用 PTY.spawn 而不是 Open3.popen3 来做,但没有运气。此外,我在期望中设置了一个超时,当这种情况发生时再次写入标准输入。我从这篇文章中得到了保持标准输入打开的想法: ruby popen3 -- 如何在不重新打开进程的情况下重复写入标准输入和读取标准输出?
我需要保持标准输入打开,因为下一步将是标准输出为标准输入等提供新信息。
所以这段代码最终打印出 625 ,这意味着 625 成功stdin.puts "e0"
。但它应该一直持续下去,直到出现一些用户干扰,例如ctrl c
.
解决方案
我没有从 stderr 读取导致完整的管道,现在我使用 popen2。
ruby - 在 Ruby 中运行多线程 Open3 调用
我有一个大循环,我试图Open3.capture3
在线程中运行调用而不是线性运行。每个线程都应该独立运行,并且在访问数据方面没有死锁。
问题是,线程版本慢得多,它占用了我的 CPU。
下面是一个线性规划的例子:
这是线程版本:
时间比较:
ruby - 两者都实时获取 STDOUT 并提供 STDIN
我有一个命令需要我给它一些 STDIN 数据,如my-command <<< my-data
. 我无法控制命令;该信息旨在以交互方式提供并且<<<
有效。
我想将此命令作为更大脚本的一部分自动执行,但由于它的操作需要一段时间——但会将进度输出到 STDOUT——我想实时打印 STDOUT。我还希望能够捕获命令的退出状态,以确定它是否失败。
如果我使用system
,我会在发生时得到 STDOUT,但无法提供 STDIN 数据。
如果我使用Open3
,我可以提供 STDIN 数据,但 STDOUT 仅在最后打印(如果我完全捕获它)。
任何方式我都可以两全其美,最好是Open3
?
ruby - 使用 popen3 实时输出 rake 任务
popen3
在获得实时输出的同时从块内运行 rake 任务似乎是不可能的。所有行在 rake 任务结束时立即出现。popen3
我正在尝试通过一个块从 rake 任务中获取实时输出
如何重现
概念证明:rake 任务
- 创建任务如下
- 从命令行调用任务
$ rake print_and_wait
输出 3 行(A、B 和 C),中间停顿一秒。正如预期的那样
概念证明 2:popen3
- 创建一个shell脚本
- 创建一个红宝石脚本
- 运行红宝石脚本
$ 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 行同时打印
我尝试了几种组合,但始终无法使其按预期工作。知道为什么这不起作用吗?这是一个错误吗?
谢谢