Domanda

Sto giocando intorno con Rails & Sinatra, e voglio eseguire comandi sul server. Tali comandi vengono immessi da un formulario. Il fatto è che, se entro un comando che si aspetta di ingresso, tutta la mia app si blocca. Ecco il codice che sto usando per eseguirli:

@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

questo funziona bene per i comandi semplici come ls ... ma per esempio se entro pause che aspettano all'utente di premere un tasto per continuare, tutto si blocca. Come posso ottenere intorno a questo?

EDIT: ho appena ricordato ho chiesto lo scorso anno sul comportamento filo di Ruby qui: Perché questa corsa come esso non è infilato? . Ho provato a fare funzionare Sinatra utilizzando un interprete 1.9.1 e ha funzionato. Sotto 1.8.6 non è così però. Un mod può chiudere questo problema, se vuole.

È stato utile?

Soluzione 2

Soluzione: ho appena ricordato ho chiesto lo scorso anno sul comportamento filo di Ruby qui: Perché questa corsa come esso non è infilato? . Ho provato a fare funzionare Sinatra utilizzando un interprete 1.9.1 e ha funzionato. Sotto 1.8.6 lo fa non però.

Altri suggerimenti

Prova tubazioni / dev / null nel vostro processo figlio:

IO.popen("#{params[:command]} </dev/null") do ...
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top