一种从Node.js调用execl,execle,execlp,execv,execvP或execvp的方法

时间:2015-12-15 13:22:14

标签: javascript node.js exec system-calls

POSIX系统公开exec函数族,允许人们在当前进程中加载​​可能不同的东西,保留打开的文件描述符,进程标识符等。

这可以由于各种原因而完成,在我的例子中,这是bootstrapping - 我想更改我自己的进程的命令行选项,然后在现有进程上重新加载它,因此不会有子进程。

不幸的是,令我惊讶的是,我找不到在Node.js中调用任何exec*函数的方法。那么,用其他图像替换当前运行的Node.js进程的正确方法是什么?

3 个答案:

答案 0 :(得分:3)

我创建了一个模块来调用NodeJS中的execvp函数:https://github.com/OrKoN/native-exec

它的工作原理如下:

var exec = require('native-exec');

exec('ls', {
  newEnvKey: newEnvValue,
}, '-lsa'); // => the process is replaced with ls, which runs and exits

由于它是本机节点插件,因此需要安装C ++编译器。在Docker,Mac OS和Linux上运行良好。可能在Windows上不起作用。使用节点6,7和8进行测试。

答案 1 :(得分:1)

我最终使用ffi模块,并从execvp导出libc

答案 2 :(得分:0)

这里是使用node-ffi并与节点v10一起使用的示例。 (不是,不是v12)

#!/usr/bin/node

"use strict";

const ffi = require('ffi');
const ref = require('ref');
const ArrayType = require('ref-array');
const stringAry = ArrayType('string');

const readline = require("readline");
const rl = readline.createInterface({
  input: process.stdin,
  output: process.stdout
});

rl.question('Login: ', (username) => {
    username = username.replace(/[^a-z0-9_]/g, "");
    rl.close();
    execvp("/usr/bin/ssh", "-e", "none", username+'@localhost');
});



function execvp() {
    var current = ffi.Library(null, 
                              { execvp: ['int', ['string',
                                                 stringAry]],
                                dup2: ['int', ['int', 'int']]});
    current.dup2(process.stdin._handle.fd, 0);
    current.dup2(process.stdout._handle.fd, 1);
    current.dup2(process.stderr._handle.fd, 2);
    var ret = current.execvp(arguments[0], Array.prototype.slice.call(arguments).concat([ref.NULL]));    
}