node.js - 从子进程的子进程获取标准输出

标签 node.js linux vpn

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

进程树:

  • 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 }

我的 Node 代码:

...
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) {
         ...
    });
}

最佳答案

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

关于node.js - 从子进程的子进程获取标准输出,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38378263/

相关文章:

Linux串口I/O问题

javascript - 无法使用 npm 5.6.0 安装 cordova

linux - 通过 shell 在后台运行 php 脚本-脚本永远不会在 mac os x 上执行

Android - native 层的 VPN

Android 应用程序未使用自签名证书连接到 HTTPS

mysql - Sequelize : how to find a Max element

node.js - Express 的 get 函数中以下路径表示 "/^\/.*/"是什么意思?

javascript - 用 Nodejs 写标准输出

javascript - getCurrentPosition 落后于 VPN - 为什么?

javascript - 根据数组中的值实时追加