2010-02-27 8 views
0

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.

+0

Je pense que vous vouliez dire "La chose est, si j'entre une commande qui attend ** entrée ** ..." n'est-ce pas? –

+0

Ouais. Désolé à ce sujet. – Geo

+0

Attendez-vous que les threads se terminent par 'join' plus tard? Ce morceau de code semble me convenir. – vava

Répondre

0

Solution: Je viens de me rappeler que j'ai demandé l'année dernière sur le comportement de 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.

0

tuyauterie Try/dev/null dans votre processus d'enfant:

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