私は使用しています:
- 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
いるので、適切な出力が得られます)。