从子进程的子进程获取标准输出
Get stdout from subprocess of subprocess
我正在 Node 中编写一个应用程序来自动创建 VPN 隧道,并试图从命令 ipsec auto --add MyConnection
(下面的生成代码)中获取标准输出,但是看起来这个命令实际上执行了多个子进程,其中之一产生我需要的标准输出。有没有办法将此输出拉入 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 }
我的节点代码:
...
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 中编写一个应用程序来自动创建 VPN 隧道,并试图从命令 ipsec auto --add MyConnection
(下面的生成代码)中获取标准输出,但是看起来这个命令实际上执行了多个子进程,其中之一产生我需要的标准输出。有没有办法将此输出拉入 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
- 18271 -
- 18269 - `awk /^= / { exit $2 } $1 != "002" { print }
- 18268 -
- 18266 -
- 18264 -
我的节点代码:
...
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
强制缓冲区在每次写入时刷新,而不是在执行结束时刷新。