如何自动停止在后台运行的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
}
这里唯一的“魔法”是:
- 当你 运行 在后台使用
bash
shell 的命令时(这是当你将 &
添加到末尾时发生的情况),你可以发现它使用 $!
的 PID,但仅在命令后立即使用 运行。 (参见 Advanced Bash-Scripting Guide: Chapter 9. Another Look at Variables - 9.1. Internal Variables 了解其描述。)
- 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。
我正在使用 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
}
这里唯一的“魔法”是:
- 当你 运行 在后台使用
bash
shell 的命令时(这是当你将&
添加到末尾时发生的情况),你可以发现它使用$!
的 PID,但仅在命令后立即使用 运行。 (参见 Advanced Bash-Scripting Guide: Chapter 9. Another Look at Variables - 9.1. Internal Variables 了解其描述。) - 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。