Некоторые команды зависают в моем веб-приложении на Ruby - PullRequest
0 голосов
/ 27 февраля 2010

Я играю с 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 здесь: Почему это работает, как будто это не поток? Я попытался запустить Sinatra с помощью интерпретатора 1.9.1, и это сработало. Однако, под 1.8.6 это не так. Мод может закрыть этот вопрос, если захочет.

Ответы [ 2 ]

0 голосов
/ 17 сентября 2011

Решение: Я только что вспомнил, что спрашивал в прошлом году о поведении потока Ruby здесь: Почему это работает так, как будто оно не имеет многопоточности? . Я попытался запустить Sinatra с помощью интерпретатора 1.9.1, и это сработало. Под 1.8.6 это не так.

0 голосов
/ 27 февраля 2010

Попробуйте подключить / dev / null к вашему дочернему процессу:

IO.popen("#{params[:command]} </dev/null") do ...
...