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 回答