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

时间:2015-01-06 22:32:39

标签: javascript node.js build background npm

我使用npm脚本,我有一些应该并行运行。我有这样的事情:

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

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

我该怎么做? 谢谢!

3 个答案:

答案 0 :(得分:16)

我不相信npm是管理流程之间复杂关系的最佳工具。

通过创建使用节点的child_process模块来管理协同进程的启动和终止的节点脚本(可能使用spawn),您将获得更好的服务。

话虽如此,并本着始终努力提供直接,有用的答案的精神。

你可以构建你的npm脚本,如(假设 bash shell):

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在后台运行命令时(这是在结尾添加&时会发生的情况),您可以使用$!发现它,但是仅在命令运行后立即执行。 (有关其说明,请参阅Advanced Bash-Scripting Guide: Chapter 9. Another Look at Variables - 9.1. Internal Variables。)
  2. taskB 必须在成功时调用process.exit(0)或在失败时调用process.exit(-1),以便正确处理&&测试。 (有关详细信息,请参阅this answer。)

答案 1 :(得分:1)

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进行顺序。)

答案 2 :(得分:0)

使用concurrently package看起来不那么棘手&痛苦的方式。这样可以完全避免分离的进程(&)。并承诺更加跨平台。

npm install concurrently --save

然后在 package.json

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

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