Node.js 代码有时失败,有时运行
就node.js而言,我是个新手。 这是我的nodejs代码:Node.js 代码有时失败,有时运行,node.js,Node.js,就node.js而言,我是个新手。 这是我的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',f
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);
});
现在这段代码有时会失败,有时会运行。我现在很困惑。
当它失败时,它说:
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
有什么想法吗?这显然是一个竞争条件,因为node.js是一个高度并行的环境,您已经找到了一个非常好的示例来演示这一点
ls.on('exit',function(code){
console.log('Exit code '+code);
grep.stdin.end();
})
ls在完成对grep的写入之前触发上述事件,然后关闭用于通信的套接字。输出给您的提示是,来自ls的exit(0)消息在输出的顶部出现一次,在错误消息的正上方出现一次
你不应该在这里关闭格雷普的标准频道
但是,在执行以下操作的bash脚本上使用.exec()而不是spawn怎么样
#/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);
}
});
对于这些事件,您的代码顺序更难阅读。如果将所有涉及
ls.stdout
的内容替换为ls.stdout.pipe(grep.stdin)
,会发生什么?