【问题标题】:A way to call execl, execle, execlp, execv, execvP or execvp from Node.js一种从 Node.js 调用 execl、execle、execlp、execv、execvP 或 execvp 的方法
【发布时间】:2015-12-15 13:22:14
【问题描述】:

POSIX 系统公开了一系列exec 函数,允许将可能不同的内容加载到当前进程中,保持打开的文件描述符、进程标识符等。

这可以出于多种原因完成,在我的例子中,这是引导程序——我想更改我自己进程的命令行选项,然后在现有进程上重新加载它,这样就不会有子进程了。

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

【问题讨论】:

标签: javascript node.js exec system-calls


【解决方案1】:

我创建了一个模块来从 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 进行测试。

【讨论】:

  • 我猜它不应该在 Windows 中工作,除非在 LXSS 中启动。
【解决方案2】:

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

【讨论】:

  • 您能分享一下您用来执行此操作的代码吗?谢谢。
【解决方案3】:

这是一个使用 node-ffi 的示例,该示例适用于 node 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]));    
}

【讨论】:

    猜你喜欢
    • 2019-09-08
    • 1970-01-01
    • 2023-03-24
    • 1970-01-01
    • 2012-12-05
    • 1970-01-01
    • 1970-01-01
    • 2020-06-27
    • 2014-12-21
    相关资源
    最近更新 更多