加入收藏 | 设为首页 | 会员中心 | 我要投稿 阜阳站长网 (https://www.0558zz.com/)- 科技、建站、内容创作、云计算、网络安全!
当前位置: 首页 > 综合聚焦 > Windows > 正文

如何在Windows上正确使用node.js child_process.spawn()重定向?

发布时间:2020-07-21 20:03:18 所属栏目:Windows 来源:互联网
导读:我有一个干净的 Windows 8.1框,安装了lates node.js(v0.10.29).我在两个文件中有以下测试代码: a.js var sub = require(child_process).spawn(node, [b.js], {silent: true});sub.stdout.on(data, function (data) {console.log(data

我有一个干净的 Windows 8.1框,安装了lates node.js(v0.10.29).我在两个文件中有以下测试代码:

a.js

var sub = require('child_process').spawn('node',['b.js'],{silent: true});
sub.stdout.on("data",function (data) {console.log(data.toString());});

b.js

console.log("DEBUG 1");
console.log("DEBUG 2");
process.exit();

如果我通过以下方式执行a.ja:

node a.js

我将在控制台输出中看到“DEBUG 1” – 但不是“DEBUG 2”.如果我删除process.exit(),两行将正确显示. fork和spawn都会发生这种奇怪的行为.

任何提示?相同的代码在linux上没有问题.

更新02.07.2014

似乎这不是exit()和log()之间的竞争条件,因为将其更改为纯序列会产生相同的错误:

function print(text,next) { console.log(text); next(); }
print("DEBUG 1",function () {
  print("DEBUG 2",function () {
    process.exit();
  });
});

更新03.07.2014

silent不在spawn()文档中列出,但它可以工作.它列在fork文档中,正如我之前提到的,这个问题与fork相同.

似乎如果我在last输出和process.exit()之间引入延迟,则所有工作都正常:

console.log("DEBUG 1");
console.log("DEBUG 2");
setTimeout(function () {process.exit();},10000);

但问题只有在我将输出管道输出到父进程时才显现出来:如果我删除了静音,两条消息都会正确显示,即使没有延迟,所以管道通信最有可能出错,而不是使用process.exit.

更多更新03.07.2014

在评论中推测,process.exit()可以终止两个进程(a.ja和b.ja).不,它终止只生成/分叉进程,我通过向a.js添加无限setTimeout来检查这一点,它很高兴在b.ja终止后仍然有效,但仍然没有“DEBUG 2”行.

主要编辑清晰:

您遇到的问题是console.log(‘DEBUG2’)和process.end()之间的并发事件,它们中的两个同时被调用(几乎),但process.end()具有更高的优先级,并且完成后,让子停止监听事件,然后停止打印DEBUG2:

在你的代码中:

a.js                |b.js
start
spawn               |start
listen              |send('DEBUG1')
get DEBUG1          |send('DEBUG2')
start the event     |send KILL
print DEBUG1        |
get DEBUG2
start the event
get KILL
kill b.js //DEBUG2 haven t been printed

现在,如果你减慢process.end:

b.js:

console.log('DEBUG1');
console.log('DEBUG2');
setTimeout(function () {
    process.end();
},1000);

a.js                |b.js
start
spawn               |start
listen              |send('DEBUG1')
get DEBUG1          |send('DEBUG2')
start the event     |wait
print DEBUG1        |wait
get DEBUG2          |send KILL
start the event
print DEBUG2
get KILL
kill b.js

但那太麻烦了,你不知道会有多少“等待”.另一种解决方案是使b.js继承stdout,因此没有事件要做:

a.js:

var sub = require('child_process').spawn('node',{stdio:[process.stdin,process.stdout,process.stderr]});

a.js                |b.js
start
spawn               |start
listen              |print DEBUG1
                    |print DEBUG2
                    |send KILL
get KILL            |
kill b.js

现在,没有容易出错的代码,但你无法获得a.js中打印的内容.我认为使用process.nextTick的另一个解决方案可以工作,但我不知道它是如何工作的.

编辑:

process.exit()kill b.js,这是预期的行为. a.js看到数据事件结束,所以有一个空的事件循环,所以自杀:)

(编辑:阜阳站长网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读