2016-06-24 10 views
0

Ich habe nächsten Codepopen3 hängt, wenn Skript mit popen3 Ausführung

def execute_bash(cmd) 
    puts "Executing: [#{cmd}]" 
    exit_code = Open3.popen3(cmd) do |stdin, stdout, stderr, wait_thr| 
    stdin.close 
    stdout.each { |line| puts line } 
    stdout.close 
    stderr.each { |line| puts line } 
    stderr.close 
    wait_thr.value.exitstatus 
    end 
    return exit_code 
end 

Befehl, den ich mit dieser Funktion laufe vagrant oben ist, die eine Menge Ausgabe erzeugt. Ich habe viele Rezepte, daher muss ich die Ausgabe in Echtzeit zeilenweise überwachen.

Und ich habe ein anderes Skript, das dafür sorgt, dass das vorherige Skript gut gelaufen ist und nicht abstürzte. Also habe ich ein anderes Skript, das Bash-Befehle auf die gleiche Weise wie zuvor ausführt. Also ich bin wie Laufen (im zweiten Skript):

Eine solche Konsequenz führt mich zu Dead-Lock oder etwas: in einigen Punkt endet der Ausgang. Ich könnte eine Menge Zeit warten, aber es wird nicht fortgesetzt.

Wenn ich nur Vagabund in der Konsole laufen - alles ist in Ordnung.

Ist das ein Problem, Ruby-Skript mit popen3 in einem anderen popen3 ausführen? Gibt es in popen3 die richtige Methode, um tote Sperren zu handhaben (wenn es tot ist, bin ich mir nicht sicher)?

Antwort

0

Schwer zu sagen, was das eigentliche Problem ist, ohne die Details von vagrant_up.rb zu sehen, sondern folgendes zu beachten. Hier

Ich habe einen kleinen Bash-Skript:

#!/bin/sh 
#out.sh 
echo "about to sleep" 
sleep 3 
echo "just woke up" 

Und einen andere:

#!/bin/sh 
#err.sh 
echo "about to sleep" 1>&2 
sleep 3 
echo "just woke up" 1>&2 

mit Ihrem Code, lief execute_bash("out.sh") etwas produziert, das wahrscheinlich mit Ihren Erwartungen entsprechen. Es heißt "etwa schlafen" und dann 3 Sekunden später heißt es "gerade aufgewacht". Aber, läuft execute_bash("err.sh") etwas etwas überraschend. Es wartet 3 Sekunden und druckt dann "um zu schlafen" und "gerade aufgewacht".

Also, für Ihre Situation, hier ist meine Vermutung. Ihr Befehl erzeugt wahrscheinlich eine Menge von Ausgaben an stderr, und Sie sehen es einfach nicht. Tatsächlich werden Sie es erst sehen, wenn der Befehl beendet ist (weil der Stdout-Stream für den Open3-Prozess erst dann geschlossen wird).

Können Sie stderr einfach auf stdout umleiten? Können Sie einen Kommentar abgeben, wenn das Problem dadurch nicht behoben wird?

execute_bash("./vagrant_up.rb 2>&1") 
+0

Leider Umleitung stderr hat nicht geholfen. Konnten dieselben Deadlocks mit der Funktion system() auftreten? – GALIAF95

Verwandte Themen