我使用:红宝石 - Open3没有完成子
- 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读的是我的PROBL EM。 I 需要从Open3接收一些输出,以便我可以在浏览器中显示它,但我猜测它什么时候尝试读取它会启动Open3不知道的另一个进程,因此Open3继续并完成而不等待它)
- 退出
退出
我发现有关以下内容:
- 使用的Thread.join(在这种情况下,w.join),以等待进程结束,但它不起作用
- OPEN4似乎处理子进程,但在Windows不起作用
- Process.wait(PID),在这种情况下PID = w.pid,但也不起作用
- Timeout.timeout(N) ,这里的问题是我不知道它需要多长时间。
有没有办法处理这个问题?提前(等待Open3子,所以我得到正确的输出)
感谢
URL“http:// localhost/process”的意义是什么? – hagello 2014-11-30 06:56:20