如何自动停止在后台运行的npm脚本

How to stop npm script running in background automatically

我正在使用 npm 脚本,我有一些脚本应该并行运行。我有这样的东西:

...
scripts: {
   "a": "taskA &",
   "preb": "npm run a",
   "b": "taskB"
}
...

这很好!但是我想在 taskB 完成后自动杀死运行后台的 taskA。

我该怎么做? 谢谢!

我不认为 npm 是管理进程之间复杂关系的最佳工具。

创建一个使用节点 child_process module to manage the launching and killing of co-processes, perhaps using spawn.

的节点脚本会更好

话虽如此,本着始终努力提供直接、可用的答案的精神..

你可以像 (assumes bash shell):

这样构造你的 npm 脚本
scripts:{
    runBoth: "npm runA & npm runB",     // run tasks A and B in parallel
    runA:    "taskA & TASKA_PID=$!",    // run task A and capture its PID into $TASKA_PID
    runB:    "taskB && kill $TASKA_PID" // run task B and if it completes successfully, kill task A using its saved PID
}

这里唯一的“魔法”是:

  1. 当你 运行 在后台使用 bash shell 的命令时(这是当你将 & 添加到末尾时发生的情况),你可以发现它使用 $! 的 PID,但仅在命令后立即使用 运行。 (参见 Advanced Bash-Scripting Guide: Chapter 9. Another Look at Variables - 9.1. Internal Variables 了解其描述。)
  2. taskB 必须 在成功时调用 process.exit(0) 或在失败时调用 process.exit(-1) 以便 && 测试正确处理。 (有关详细信息,请参阅 this answer。)

npm-run-all 包可能是您要找的:

$ npm install --save npm-run-all

然后在您的 package.json 文件中:

"scripts": {
    "runA": "taskA",
    "runB": "taskB",
    "runBoth": "npm-run-all -p runA runB"
}

-p 并行运行它们,使用 -s 顺序运行。)

使用 concurrently package 看起来是一种不那么棘手和痛苦的方法。这避免了分离进程(&)。并承诺会更多 cross-plattform。

npm install concurrently --save

然后在package.json

"runBoth": "concurrently \"npm run taskA\" \"npm run taskB\"",

测试(在 Ubuntu 16.04,npm 5.6 下),也 see here