问题标签 [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 popen3 检查命令是否存在
我正在尝试使用以下代码检查系统命令是否存在:
但是它只是崩溃并显示以下错误消息并且不会继续:
为什么以及如何解决它?
ruby - 使用 Open3.capture3 和 rake 时丢失 STDOUT?
我在工作中使用的构建系统会调用几个外部控制台应用程序,Node.js 等。
我看到的问题是 STDOUT 通道在Open3.capture3
调用后似乎不起作用。例如,我有一个名为compileLess
:
我希望看到的是这样的:
但是在调用Open3.capture3
disablesputs
和print
. 我可以通过明确使用来强制他们工作:
我只是想知道为什么它不起作用。
眼镜:
- 窗口 7 专业版 32 位
- 红宝石 1.9.3p392 (2013-02-22) [i386-mingw32]
- 耙子,版本 10.1.0
- 节点 v0.10.22
ruby - 从 ruby 运行 `git add -p`
我正试图git add -p
逃离红宝石。问题是这个命令显示部分文件并等待用户输入,可能会打开 git 编辑器。由于这个原因,执行系统命令的常规内核方法将不起作用。我尝试使用open3
,这是我到目前为止得到的:
我不知道该放什么,在互联网上也找不到任何线索。
有什么想法可以解决这个问题吗?
注意:我不想使用任何宝石
编辑: open3
不工作。我现在正在试验pty
. 这是我所拥有的:
此代码打印要修补的第一个块,但随后 git 询问的“问题”(换句话说,标准输入提示)没有出现。我显然没有在上面的代码中打印它,但我似乎无法找到如何做到这一点。有任何想法吗?
ruby - 在不同的 ruby 版本中启动子进程
我正在使用 daemon kit 启动一个后台 ruby 进程来侦听 Amazon SQS 消息。一旦收到一条消息,它就会使用需要在 JRuby 中运行的 Open3.popen3 启动一个子进程。
后台进程需要在 MRI 中运行,因为 daemon kit 使用 Process.daemon 来守护进程。但到目前为止,我还不能强制子进程在 JRuby 中运行。
我正在使用 rbenv 来管理 ruby 版本,所以起初我认为这会起作用:
但是在子进程输出中我收到错误:“rbenv: jruby: command not found”
然后我跟踪了 rbenv 如何运行它的可执行文件,以便我可以绕过 rbenv 并直接在 JRuby 中运行 rp5 可执行文件。
我首先在文件夹中找到了 rp5 可执行文件:~/.rbenv/versions/jruby-1.7.8/bin/rp5
然后我执行 Gem.bin_path 方法来查找它正在调用的 rp5 可执行文件。在 gem 里面: ~/.rbenv/versions/jruby-1.7.8/lib/ruby/gems/shared/gems/ruby-processing-2.3.1/bin/rp5 然后我尝试通过调用运行子进程这个 rp5 可执行文件直接:
但我仍然收到相同的“未找到 jruby 命令”错误。
然后我检查了那个可执行文件:
那么顶部的 shebang 是否意味着该可执行文件正在使用默认的 ruby 版本?
甚至可以在完全不同的 ruby 版本中启动子进程吗?
谢谢。
ruby - 使用带超时的多线程时,ruby Open3.capture3 中的关闭流(IOError)
我希望运行几个系统命令,并获得以下信息:
- 我希望在同一进程下的不同线程中运行每个命令
- 我希望捕获并存储输出和退出状态。
- 我希望在执行时间上设置超时以查找是否某些系统命令被卡住。
不幸的是,以下代码以:
/usr/lib/ruby/1.9.1/open3.rb:276:in
read': closed stream (IOError) from /usr/lib/ruby/1.9.1/open3.rb:276:in
块(2 级)在 capture3'
偶尔,依赖于线程调度。例如,当将超时更改为 2 秒(或完全删除超时块)时,代码可以工作。
这是一个示例代码:
我曾尝试过rescue
inoutput_from
方法并关闭 o,但它也没有帮助。我觉得线程以某种方式在 popen3 实现中共享管道或一些变量。
linux - IPC::Open3 以与独立 snmwalk 命令不同的行为运行 snmpwalk
我制作了一个自定义 sub 来使用 Open3 在 perl 中运行各种终端命令。
我在使用 snmpwalk 时遇到了一个奇怪的问题,当我在终端中运行该命令时它可以工作,但使用 Open3 则不会。
子是这样的:
我称之为:
如果我想运行以下命令:
snmpwalk -c public -v1 somehostname NETAPP-MIB::aggrName
它以 $err 的形式返回:
snmpwalk:未指定安全名称
如果我在终端中运行完全相同的命令,它会返回我的结果:
NETAPP-MIB::aggrName.1 = 字符串:“SAS2”
NETAPP-MIB::aggrName.2 = 字符串:“SATA1”
...
我发现 NET::SNMP 可以解决我的问题,但由于硬化的 linux 操作系统没有安装选项,我无法安装它。
我真的不明白为什么它不起作用。
perl -v:5.8.8
谢谢!
ruby-on-rails - Ruby on Rails。将exe文件的输出返回到浏览器
第一次使用 Ruby 或 Rails,所以请多多包涵 :) 我正在尝试将 exe 文件的结果输出到我的浏览器,可能需要事先进行一些处理。我正在使用 Open3
这可行,但输出似乎只在 exe 文件完成时返回任何内容,例如,如果它手动关闭,或者如果它返回错误。
当我执行文件时实际发生的是服务器运行并将信息返回到控制台。我在控制台运行时需要这些数据,而不是之后。
我的问题:如何从控制台实时返回、处理和显示每一行?这甚至可能吗?
ruby - Ruby—Open3.popen3 / 如何打印输出
我有一个小 ruby 脚本,它以mysql
方式进行导入:mysql -u <user> -p<pass> -h <host> <db> < file.sql
,但Open3.popen3
用于这样做。这就是我到目前为止所拥有的:
那实际上是在做这项工作,但有一件事情让我感到困扰,与我想看到的输出有关。
如果我将第一行更改为:
然后整个脚本永远挂起。
我想,这是因为读写流相互阻塞,而且我还猜想stdout
需要定期刷新,以便stdin
继续消耗。换句话说,只要缓冲区stdout
已满,进程就会等到它被刷新,但由于这是首先在最底层完成的,所以这永远不会发生。
我希望有人可以验证我的理论?我怎么能写出打印出所有内容的代码,stdout
并将所有内容都写入其中stdin
?
提前谢谢!
ruby - 为什么缺少可执行文件时 Open3.popen3 会返回错误错误?
我正在围绕 CLI 制作一个 Ruby 包装器。我找到了一个简洁的方法Open3.capture3
(内部使用Open3.popen3
),它可以让我执行命令并捕获标准输出、标准错误和退出代码。
我想要检测的一件事是是否找不到 CLI 可执行文件(并为此引发特殊错误)。我知道 UNIX shell127
在找不到命令时会给出退出代码。当我$ foo
在 bash 中执行时,我得到-bash: foo: command not found
了,这正是我想要显示的错误消息。
考虑到所有这些,我编写了如下代码:
但是,当我用 运行它时command = "foo"
,我得到一个错误:
为什么会出现这个错误?我以为Open3.capture3
应该直接在 shell 中执行该命令,为什么我没有得到正常的 STDERR 和退出代码127
?