2016-06-24 2 views
0

でスクリプトを実行するときに、私は次のコードpopen3がpopen3

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 

を持ってハングアップ、私はこの機能を実行するコマンドは大量の出力を生成すること、アップ浮浪者です。私はレシピをたくさん持っているので、それをリアルタイムでモニターする必要があります。

また、以前のスクリプトが正常に実行され、クラッシュしないことを保証する別のスクリプトがあります。だから私は以前と同じようにbashコマンドを実行する別のスクリプトを持っています。だから私は(2番目のスクリプトで)実行されているようだ:

execute_bash "./vagrant_up.rb" 

このような結果は死んでロックか何かに私をリード:いくつかの点出力停止中。私は多くの時間を待つことができますが、それは続かないでしょう。

私はコンソールで迷惑メールを実行すると、すべて正常です。

他のpopen3でpopen3を使ってrubyスクリプトを実行するには問題がありますか? popen3のデッドロックを処理する適切な方法はありますか?(デッドロックの場合、わかりません)

答えて

0

vagrant_up.rbの詳細を確認せずに実際の問題が何であるかは言うまでもありませんが、以下を考慮してください。 execute_bash("out.sh")はあなたの期待に沿ったものである可能性があり、何かを生成実行している、あなたのコードで

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

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

別:

は、ここで私は少しbashスクリプトを持っています。それは "約眠っている"と3秒後に "ちょうど起こった"と言います。しかし、 execute_bash("err.sh")を実行すると、少し驚くべきことが起きます。それは3秒間待ってから「眠る」と「ちょうど起こった」と表示されます。

あなたの状況のた​​めに、私の推測です。あなたのコマンドはおそらくstderrに多くの出力を生成しており、あなたはそれを見ていないだけです。実際には、コマンドが終了するまで(Open3プロセスのstdoutストリームはそれまで閉じられていないため)表示されません。

stderrをstdoutにリダイレクトできますか?これで問題が解決しない場合はコメントできますか?

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

残念ながら、stderrのリダイレクトは役に立ちませんでした。 system()関数で同じデッドロックが発生する可能性はありますか? – GALIAF95

関連する問題