如何在Windows上正确使用node.js child_process.spawn()重定向?
我有一个干净的
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看到数据事件结束,所以有一个空的事件循环,所以自杀:) (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
- 如何在Windows 7上设置Drupal Console?
- windows – 如何说服Visual Studio在TCP / IP上使用ADB for
- windows环境下安装composer,然后使用composer安装Laravel
- Win10专业版系统下添加其他国家语言
- .net core autofac automapper
- windows-server-2008-r2 – 与Microsoft NPS / RADIUS / PE
- 无法在Windows 8上使用SetSystemTime设置时钟
- windows-phone-7 – 将麦克风流保存为mp3或wave
- windows – 是否有像PeekMessage这样的函数不处理消息?
- windows – Heroku:’https://git.heroku.com’的用户名:
- .net – 如何在使用Microsoft.Build.Evaluation(
- xaml – 如何检测方向变化和更改布局?
- windows-server-2003 – 在家里使用回收的硬件?
- 如何在Windows Phone Web浏览器中显示本地HTML?
- windows-xp – 通过浏览器查找(Windows)计算机名
- microsoft-office-365 – 是否可以在Office 365上
- 命令行 – 从DOS命令行关闭正在运行的应用程序
- windows – 如何在批处理文件中等待exe完成?
- 编程语言 – 我应该将哪个开发平台用于桌面Windo
- 域名系统 – 重新启动Windows DNS服务之前的DNS解