Некоторые команды вешают мое веб-приложение на Ruby

Я играю с 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 ответа

Решение

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

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

IO.popen("#{params[:command]} </dev/null") do ...
Другие вопросы по тегам