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

What are the differences between the processes run by npm command:

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

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

在我使用 npm 运行 release 启动服务器后,我可以看到如下多个进程 运行ning 在我的 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/.. => 节点 server/app.js ?
  2. 每个进程的作用是什么? 运行 我的服务器需要这三个进程吗?
  3. 如果我想用 pid 杀死服务器,我应该使用哪个进程 ID?

What is the order of creating processes? npm => /bin/sh => node /api/.. => node server/app.js ?

What does each process do? All three processes are necessary to run my server?

嗯,流程是这样的:

  • NPM 在你的 shell 中产生(你 运行 它),npm 本身 运行s 与 NPX in order to set the local path
  • 您的 npm 脚本从名为 cross-env 的包中生成一个进程,用于 cross-OS 环境变量设置。
  • 该进程依次产生 Node.js(设置环境变量后)

这就是您看到 3 个进程的原因。在您的服务器本身 运行 之后 - 运行 服务器只需要实际的服务器进程。

If I wants to kill the server with pid, which process id should I use?

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


值得一提的是,一般来说 - 服务器 运行 位于容器或其他 orchestrators/managers 中,这些 built-in 逻辑用于 restarting/killing 进程。通常,编排器会向进程发送 SIGTERM。