我在用着:
- Ruby 1.9.3-p448
- Windows Server 2008
我有一个包含程序使用的命令的文件,我正在以这种方式使用它
C:\> PATH_TO_FOLDER/program.exe file.txt
File.txt
有一些命令,所以program.exe
将执行以下操作:
- Execute commands
- Reads from a DB using an ODBC method used by program
- Outputs result in a txt file
使用 powershell 此命令可以正常工作并且符合预期。
现在我在一个文件(app.rb
)中有这个:
require 'sinatra'
require 'open3'
get '/process' do
program_path = "path to program.exe"
file_name = "file.txt"
Open3.popen3(program_path, file_name) do |i, o, e, w|
# I have some commands here to execute but just as an example I'm using o.read
puts o.read
end
end
现在,当通过访问来使用它时http://localhost/process
,Open3
可以通过这样做来工作(我不是 100% 确定,但在尝试了几次之后,我认为这是唯一的选择)
读取命令并执行它们(这没关系)
尝试使用 ODBC 方法从 DB 读取(这是我的问题。我需要从其中接收一些输出,
Open3
以便可以在浏览器中显示它,但我猜当它尝试读取它时会启动另一个Open3
不知道的进程,所以Open3 继续并完成而不等待它)出口
出口
我发现了以下内容:
- 使用
Thread.join
(在这种情况下,w.join
)为了等待进程完成,但它不起作用 Open4
似乎可以处理子进程,但在 Windows 上不起作用Process.wait(pid)
,在这种情况下pid = w.pid
,但也不起作用Timeout.timeout(n)
,这里的问题是我不确定需要多长时间。
有没有办法处理这个?(等待Open3
子进程,所以我得到正确的输出)。