2017-01-25 51 views
0

原谅这个愚蠢的问题,如果是这样,我对Node来说比较新。子进程输出到socket.io

我在我的节点服务器上产生一个子进程,用于将数据集导入数据库。子进程使用参数执行osm2pgsl,它有自己的内部输出,用于显示当前处理的数据和已处理内容的计数。

我有一个简单的节点脚本来产生这个过程,并记录来自这个过程的信息,当它到达时。我需要访问的主要信息不通过stdout, stderr or on进行轮询,这是有问题的。

节点脚本

var util = require('util'), 
    spawn = require('child_process').spawn, 
    file = process.argv[2], 
    ls = spawn('osm2pgsql', ['--slim', '-d', 'gis', '-U', 'postgres', '--number-processes', '3', file]); 

ls.stdout.on('data', function (data) { 
    process.stdout.write('Currently processing: ' + data.toString() + '\r'); 
}); 

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

ls.on('exit', function (code) { 
    console.log('child process exited with code ' + code.toString()); 
}); 

输出

Mid: pgsql, scale=100 cache=800 
Setting up table: planet_osm_nodes 

stderr: NOTICE: table "planet_osm_nodes" does not exist, skipping 

stderr: Setting up table: planet_osm_ways 

stderr: NOTICE: table "planet_osm_ways" does not exist, skipping 

stderr: Setting up table: planet_osm_rels 

stderr: NOTICE: table "planet_osm_rels" does not exist, skipping 

stderr: 
Reading in file: /OSMDATA/great-britain-latest.osm.pbf 

Processing: Node(10k 10.0k/s) Way(0k 0.00k/s) Relation(0 0.00/s) 
Processing: Node(20k 20.0k/s) Way(0k 0.00k/s) Relation(0 0.00/s) 
Processing: Node(30k 30.0k/s) Way(0k 0.00k/s) Relation(0 0.00/s) 

stderr:线,你可以看到,我能够访问流,但Processing: ...正是我需要的获得高于一切。这是从子进程内打印的,我不确定如何直接访问它。

是否有任何方式从我的Nodejs服务器访问输出(上图)?

编辑:我打算把这个输出管道连接到Socket.io,但我需要首先访问它,因此标题。

回答

0

想通了,但它可能对未来的人有用。

因为Processing: ...正在递归更新的osm2pgsql源代码使用\r单行线,它实际上是走出stderr在相同的方式一切。

输出为Processing: ...实际上是以下行:

stderr: 
Reading in file: /OSMDATA/great-britain-latest.osm.pbf 

Processing: Node(10k 10.0k/s) Way(0k 0.00k/s) Relation(0 0.00/s) 

它没有发生,我认为输出可能是多线长。我可以通过ls.stderr.on('data', function(data) {});访问输出