从子进程

时间:2016-07-14 15:26:25

标签: node.js linux vpn

我正在Node中编写一个应用程序来自动创建VPN隧道,并且我试图从命令ipsec auto --add MyConnection(下面的spawn代码)中获取stdout,但是看起来这个命令实际上执行了多个子进程,其中一个这产生了我需要的标准输出。有没有办法将此输出拉入节点?

流程树:

  • 18242 - node server.js
    • 18264 - /usr/lib/ipsec/auto --up MyConnection(这是从Node运行的唯一命令)
      • 18266 - /usr/lib/ipsec/auto --up MyConnection
        • 18268 - sh
          • 18271 - /usr/lib/ipsec/whack --name MyConnection --initiate
        • 18269 - `awk / ^ = / {exit $ 2} $ 1!=“002”{print}

我的节点代码:

...
var spawn = require('child_process').spawn;
var Hapi = require('hapi');
var server = new Hapi.Server();
server.register(Inert, function(err) {
    if (err) throw err;
});
var io = require('socket.io')(server.listener);
...
function start(file, route, socket) {
    ...
    var connect = spawn('ipsec' ['auto', '--up', file], {env: Object.create(process.env)});
    connect.stdout.on("data", function(out) {
        socket.emit('connect-out', out);
    });
    connect.stderr.on("data", function(out) {
        socket.emit('connect-out', out);
    });
    connect.on('exit', function(code) {
         ...
    });
}

1 个答案:

答案 0 :(得分:1)

我发现程序在程序终止之前没有刷新缓冲区,因此我使用命令stdbuf --output=0 ipsec auto --add MyConnection强制缓冲区在每次写入时刷新,而不是在执行结束时刷新。