2011-03-18 68 views
3

我試圖啓動一個紅寶石實例作爲我的節點程序的子進程。事實上,一切都很好,但我無法與ruby的STDIN和STDOUT交互。 (當然,Ruby程序在我的終端工作與我的鍵盤輸入)Ruby的子進程與node.js

所以這是我想工作的簡化代碼...

simpleproc.js

var util = require('util'), 
    spawn = require('child_process').spawn, 
    ruby = spawn('ruby', [__dirname + '/process.rb']); 

ruby.stdout.on('data', function (data) { 
    console.log('stdout: ' + data); 
}); 

ruby.stderr.on('data', function (data) { 
    console.log('stderr: ' + data); 
}); 

ruby.on('exit', function (code) { 
    console.log('child process exited with code ' + code); 
}); 

ruby.stdin.write("ping\n"); 

過程。 rb

f = File.new("process.log", "w") 
f.write "=== Hello! ===\n" 
STDIN.each_line do |line| 
    STDOUT.write line 
    f.write line 
end 

它有什麼問題?我已經設法得到另一個進程工作......但在這裏,沒有IO!什麼都沒發生 !

編輯:我修改了紅寶石文件,以顯示,與節點,該文件只寫入=== Hello! ===\n裏面。因此,我們可以說,紅寶石文件正確啓動,但沒有收到任何節點(我試過STDOUT.write,但永遠不會執行do語句後刷新。

+0

我試過使用你的例子,但ruby似乎掛起之前它甚至創建該日誌文件。任何想法?http://stackoverflow.com/questions/6902641/node-js- ruby-subprocess-hangs – 2011-08-01 18:25:07

回答

3

STDOUT.write後的紅寶石側試STDOUT.flush , 作爲輸出被緩衝。

+0

對不起,但它沒有工作,因爲紅寶石STDIN,沒有收到任何東西。如果我嘗試寫在do語句中的文件,反正沒有任何反應。所以,我看不到在哪裏問題是,但這可能是由於我的節點的版本(馬在github回購中的ster分支)。 – 2011-03-19 09:04:49

+0

也許這是版本。使用節點0.4.2和紅寶石1.8.7(蘋果機)你的代碼適用於我後,我添加一個沖洗(沒有它的沉默)。從ruby寫入文件或節點應該沒有什麼區別。 – michaelku 2011-03-19 09:16:18

+0

哦,男孩!事實上,我寫了'ruby.stdin.write(「ping」);'在我自己的JS文件中。但是無論如何謝謝你,你的回答很好,因爲沒有沖洗指令,就沒有辦法讓它工作!謝謝 ! – 2011-03-19 09:47:07