nodejs子进程执行脚本的问题
发布于 10 年前 作者 hylin 7512 次浏览 最后一次编辑是 8 年前 来自 问答

一个比较奇怪的问题 我用 child_process.fork('./controllers/run-task.js',[results.saveTask._id.toString(),true],{silent:true}); 来跑一个任务。run-task里面主要是调用svn命令(用了svn-interface模块)去export文件到本地,然后进行一些处理。run-task使用async.eachLimit来控制export的并发,目前是5个。 我发现任务比较多的时候比如有150个文件需要export时,通常只export到85个左右,程序就停在那里了,没有任何报错异常。 查看进程 子进程还在 QQ截图20141105110220.jpg 我如果在命令行 直接跑这个脚本 /usr/bin/nodejs ./controllers/run-task.js 5459803aa123c7080669e7c2 true 则一切正常,所有150个文件都导出完成了。 child_process.fork有什么限制么?还是我用的不对? 补充: 如果在文件比较少时,比如20个。调用child_process.fork来跑任务时可以完成的。

3 回复

额,知道哪的问题,{silent:true}参数引起的。去掉之后就好了。 不过根本原因还是不懂。。。

查询了很多资料,终于搞明白了 原因是slient=true时,子进程的stdout,stdin,stderr都会pipe到父进程,当子进程的stdout(我的例子里就是日志输出)超过了缓冲区大小,子进程就会暂停,直到缓冲区的stdout数据被读走。 而我只是创建了子进程执行脚本,就没有管它了。所以会出现导出到一定数量的文件(本质是日志输出到一定大小)就停那里了。

回到顶部