2012-10-12 80 views
0

就node.js而言,我是一個新手。我編寫了以下代碼來管理兩個linux命令。 這是我的代碼的NodeJS:代碼有時會失敗並且有時會運行

var spawn = require('child_process').spawn, 
    ls = spawn('ls',['-lh','/usr']), 
    grep = spawn('grep',['bin']); 

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

ls.stdout.on('data',function(data){ 
    console.log(""+data); 
    grep.stdin.write(data); 
}); 

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


ls.on('exit',function(code){ 
    console.log('Exit code '+code); 
    grep.stdin.end(); 
}) 

// ------------------------------------ 

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

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

下面這段代碼有時會失敗,並運行sometimes.I'm現在感到困惑。 當它失敗時,它說:

Exit code 0 
total 160K 
drwxr-xr-x 2 root root 68K Oct 12 12:54 bin 
drwxr-xr-x 2 root root 4.0K Jun 20 19:58 games 
drwxr-xr-x 54 root root 4.0K Sep 24 17:52 include 
drwxr-xr-x 252 root root 44K Oct 2 21:53 lib 
drwxr-xr-x 10 root root 4.0K Apr 28 19:16 local 
drwxr-xr-x 2 root root 12K Sep 18 15:51 sbin 
drwxr-xr-x 362 root root 12K Sep 28 17:58 share 
drwxr-xr-x 5 root root 4.0K Jul 7 23:39 src 


events.js:66 
     throw arguments[1]; // Unhandled 'error' event 
        ^
Error: This socket is closed. 
    at Socket._write (net.js:517:19) 
    at Socket.write (net.js:509:15) 
    at Socket.<anonymous> (/home/rajat/nodexperiments/full-spawn.js:13:13) 
    at Socket.EventEmitter.emit (events.js:88:17) 
    at Pipe.onread (net.js:395:14) 

,它運行時,它說:

total 160K 
drwxr-xr-x 2 root root 68K Oct 12 12:54 bin 
drwxr-xr-x 2 root root 4.0K Jun 20 19:58 games 
drwxr-xr-x 54 root root 4.0K Sep 24 17:52 include 
drwxr-xr-x 252 root root 44K Oct 2 21:53 lib 
drwxr-xr-x 10 root root 4.0K Apr 28 19:16 local 
drwxr-xr-x 2 root root 12K Sep 18 15:51 sbin 
drwxr-xr-x 362 root root 12K Sep 28 17:58 share 
drwxr-xr-x 5 root root 4.0K Jul 7 23:39 src 

Exit code 0 
stdout: drwxr-xr-x 2 root root 68K Oct 12 12:54 bin 
drwxr-xr-x 2 root root 12K Sep 18 15:51 sbin 

什麼想法?

+0

如果用'ls.stdout.pipe(grep.stdin)'替換涉及'ls.stdout'的所有內容,會發生什麼? – ebohlman

回答

0

這很明顯是一個競爭條件,因爲node.js是一個高度並行的環境,您已經找到了一個很好的示例來演示這一點。

ls.on('exit',function(code){ 
    console.log('Exit code '+code); 
    grep.stdin.end(); 
}) 

ls在完成寫入grep之前觸發上述事件,然後關閉用於通信的套接字。輸出給你的提示是來自ls的exit(0)消息出現在輸出的頂部一次,並且只出現在錯誤消息之上。

你不應該在這裏關閉grep的標準輸入通道。

但是,我們在bash腳本,做一些事情像

#/bin/bash mybashscript 
ls $1 | grep bin 

,然後使用JavaScript關閉,如

child = exec('mybashscript',['-lh','/usr'] 
    function (error, stdout, stderr) { 
    console.log('stdout: ' + stdout); 
    console.log('stderr: ' + stderr); 
    if (error !== null) { 
     console.log('exec error: ' + error); 
    } 
}); 

隨着事件使用.exec(),而不是你的產卵代碼排序更難以閱讀。

相關問題