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

标签 javascript node.js build background npm

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

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

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

我该怎么做? 谢谢!

最佳答案

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

创建一个使用 Node 的 child_process 的 Node 脚本会更好。模块来管理协同进程的启动和终止,可能使用 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 在后台运行命令时(将 & 添加到末尾时会发生这种情况),您可以使用 发现它的 PID code>$!,但仅在命令运行后立即执行。 (参见 Advanced Bash-Scripting Guide: Chapter 9. Another Look at Variables - 9.1. Internal Variables 的描述。)
  2. taskB 必须在成功时调用 process.exit(0) 或在失败时调用 process.exit(-1) 以便正确处理 && 测试。 (有关详细信息,请参阅 this answer。)

关于javascript - 如何自动停止在后台运行的npm脚本,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27808402/

相关文章:

java - Ant <jar> 任务 : using excludes parameter

Flutter:升级后构建 ndk 版本不匹配

javascript - 为什么我的 javascript 字符串大写不起作用

javascript - 如何将backbone.js 与websockets/socket-io/nowjs 一起使用

javascript - 角色扮演游戏 : store dialog in DB or JSON

mysql - react js mysql : TypeError: Cannot read property 'affectedRows'

node.js - 如何高效分离路由代码

javascript - 使用通用类 javascript 显示/隐藏 div,无 Jquery

sql-server - Node.js 和 Microsoft SQL Server

java - Android Studio 构建文件 R 损坏