1

最近我用 node.js+express 做了一个简单的 API 服务器。下面的脚本是我用来运行 npm 命令的 package.json 文件的一部分。

"scripts": {
  ...
  "release": "cross-env NODE_ENV=production MODE=release node server/app.js",
}

在我使用npm run release启动服务器后,我可以看到多个进程如下所示在我的 Linux 服务器上运行。

/bin/sh /api/node_modules/.bin/cross-env NODE_ENV=development MODE=test node server/app.js
node /api/node_modules/.bin/../cross-env/bin/cross-env.js NODE_ENV=development MODE=test node server/app.js
node server/app.js

我在这里阅读了相关文档,但我不明白后台实际发生了什么。

  1. 创建进程的顺序是什么?npm => /bin/sh => 节点 /api/.. => 节点服务器/app.js ?
  2. 每个过程的作用是什么?所有三个进程都是运行我的服务器所必需的吗?
  3. 如果我想用 pid 杀死服务器,我应该使用哪个进程 id?
4

1 回答 1

1

创建进程的顺序是什么?npm => /bin/sh => 节点 /api/.. => 节点服务器/app.js ?

每个过程的作用是什么?所有三个进程都是运行我的服务器所必需的吗?

嗯,流程是这样的:

  • NPM 在你的 shell 中生成(你运行它),npm 本身与NPX一起运行以设置本地路径
  • cross-env您的 npm 脚本会从一个名为跨操作系统环境变量设置的包中生成一个进程。
  • 该过程反过来产生 Node.js(在设置环境变量之后)

这就是为什么你会看到 3 个进程。在您的服务器本身运行之后 - 只需要实际的服务器进程来运行服务器。

如果我想用 pid 杀死服务器,我应该使用哪个进程 id?

这个:node server/app.js- 因为那是您的实际服务器,所以其他只是“实用程序”(一个用于您运行的 npm 脚本,另一个用于环境变量)。


值得一提的是,通常 - 服务器在容器或其他编排器/管理器中运行,这些编排器/管理器具有用于重新启动/终止进程的内置逻辑。通常,编排器会向进程发送 SIGTERM。

于 2020-10-13T08:58:15.310 回答