【问题标题】:NodeJS exec without creating a child processNodeJS exec 不创建子进程
【发布时间】:2020-03-29 11:01:07
【问题描述】:

在 NodeJS 中,如何进行 c 级 exec 调用,就像其他语言和运行时允许的那样(例如 Python 的 os.exec() 甚至 Bash 的 exec)?

child_process 模块(以及迄今为止我为它找到的所有包装器)不同,这意味着用execed 进程完全替换当前的NodeJS 进程。

我的目标是创建一个 NodeJS cli 适配器,您提供一组配置选项,您可以使用它来调度使用相同配置的不同工具,但每个工具对格式(有些需要 ENV VAR,一些命令行参数,有些需要文件,...)。

我寻找这样一个exec 调用的原因是,一旦该工具被分派,我就不会期望 NodeJS 进程会继续存在——它没有理由继续存在。同时,我需要工具成为前台进程(接受所有信号,控制字符,...)。在我看来,可以将所有此类事件从父 NodeJS 转发到子工具(如果我使用 child_process),但从头开始实现似乎有点太多......

干杯!

【问题讨论】:

  • 如果您使用child_process.spawn() 并设置detached 选项,那么您可以退出您的node.js 进程,新进程将自行运行。阅读文档here。要让您的 node.js 进程真正退出,您可以调用 process.exit() 或在您启动的新子进程的进程标识符上执行 subprocess.unref()
  • 感谢您的回复。我注意到了 detached 选项,但没有注意到文档中关于它的扩展部分。稍微测试一下,似乎可以启动孩子并让父母死亡,但这更像是守护进程。我特别需要让孩子处于前台并让用户能够与之交互。我只能让孩子在周围徘徊,但它的行为就像它只是连接到终端的一半......你介意举一个例子,你开始一个新的 bash 会话吗?

标签: node.js exec


【解决方案1】:

好的,所以我想我终于明白了。我将其发布为答案,因为它实际上显示了一个真实的代码示例:

child_process.spawnSync(
  "bash",
  [
    "-ic",
    ["psql"],
  ],
  {
    stdio: "inherit",
  }
);

process.exit();

这将启动 bash(带有控制 tty)并在其中包含 psql。按 ctrl-c 不会杀死节点进程;正如预期的那样,它被发送到 psql。我不知道是否有可能以节点进程在 psql 和 bash 之前终止的方式重写此代码,但对于我的用例来说,这样做了。也许甚至可以在没有 bash 的情况下完成它,但我认为 bash -i 实际上是这里的关键。

【讨论】:

    猜你喜欢
    • 2019-07-13
    • 2021-08-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-07-19
    • 1970-01-01
    • 2017-02-25
    • 1970-01-01
    相关资源
    最近更新 更多