npm命令运行的进程之间有什么区别:

问题描述

最近,我使用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

我阅读了相关的文档here,但我不了解后台实际发生的情况。

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

解决方法

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

每个过程做什么?这三个过程都是运行我的服务器所必需的吗?

嗯,流程是这样的:

  • NPM在外壳内生成(运行),npm本身与NPX一起运行,以便运行set the local path
  • 您的npm脚本从名为cross-env的程序包中生成一个进程,用于跨OS环境变量设置。
  • 该过程又会生成Node.js(在设置环境变量之后)

这就是为什么您看到3个进程的原因。服务器本身运行后-仅需要实际的服务器进程即可运行服务器。

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

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


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