Je joue avec Rails & Sinatra, et je veux exécuter des commandes sur le serveur. Ces commandes sont entrées à partir d'un formulaire. La chose est, si j'entre une commande qui attend l'entrée, mon application entière se bloque. Voici le code que je utilise pour les exécuter:Certaines commandes bloquent mon application web Ruby
@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
cela fonctionne ok pour de simples commandes comme ls
... mais par exemple, si j'entre pause
qui attend l'utilisateur d'appuyer sur une touche pour continuer, tout se bloque . Comment puis-je contourner cela?
EDIT: Je viens de me rappeler que j'ai demandé l'année dernière le comportement du fil Ruby ici: Why is this running like it isn't threaded?. J'ai essayé d'exécuter Sinatra en utilisant un interpréteur 1.9.1 et cela a fonctionné. Sous 1.8.6, ce n'est pas le cas. Un mod peut fermer cette question s'il le veut.
Je pense que vous vouliez dire "La chose est, si j'entre une commande qui attend ** entrée ** ..." n'est-ce pas? –
Ouais. Désolé à ce sujet. – Geo
Attendez-vous que les threads se terminent par 'join' plus tard? Ce morceau de code semble me convenir. – vava