0

Rails & Sinatra をいじっていて、サーバー上でコマンドを実行したいと考えています。これらのコマンドはフォームから入力されます。問題は、入力を必要とするコマンドを入力すると、アプリ全体がハングすることです。それらを実行するために使用しているコードは次のとおりです。

@threads << Thread.new do
    Thread.current["buffer"] = ""
    puts "starting #{params[:command]}"
    IO.popen(params[:command]) do |io|
        io.each_line {|l| Thread.current["buffer"] += l}
    end
end

これは...のような単純なコマンドではls問題なく機能しますが、たとえばpause、ユーザーがキーを押して続行することを期待するものを入力すると、すべてがハングします。どうすればそれを回避できますか?

編集: 昨年、ここで Rubyスレッドの動作について質問したことを思い出しました: . 1.9.1 インタープリターを使用して Sinatra を実行してみましたが、うまくいきました。ただし、1.8.6 ではそうではありません。モッドは、必要に応じてこの質問を閉じることができます。

4

2 に答える 2

0

/ dev/nullを子プロセスにパイプしてみてください。

IO.popen("#{params[:command]} </dev/null") do ...
于 2010-02-27T14:28:37.677 に答える
0

解決策:昨年、ここでRubyスレッドの動作について質問したことを思い出しました。なぜこれがスレッド化されていないように実行されているのですか?。1.9.1インタープリターを使用してSinatraを実行してみましたが、機能しました。ただし、1.8.6ではそうではありません。

于 2011-09-16T20:07:45.797 に答える