如何关闭本地 Firebase 模拟器?

问题描述 投票:0回答:12

目前我使用以下命令初始化 firebase 模拟器:

$ firebase emulators:start

经过一段时间的努力,我想停止它。我怎样才能停止模拟器?

firebase google-cloud-firestore firebase-tools
12个回答
75
投票
  1. 查看哪个进程占用了端口
    sudo lsof -i tcp:<port> 
  2. 杀死进程
    kill -9 <process id>

32
投票

一种跨平台解决方案是运行 kill-port :

npx kill-port 4000 8080 8085


31
投票

26
投票

如果你想杀死所有 firebase 模拟器,你可以通过触发此命令轻松做到这一点

$ lsof -t -i:8080 -i:9000 -i:9099 -i:9199 -i:9090 | xargs kill -9

当你不想每次都输入这么长的命令时,我建议你使用 package.json 文件中的脚本

 "scripts": {
   "emulators:start": "firebase emulators:start",
   "emulators:stop": "lsof -t -i:5001 -i:5002 -i:8080 -i:9000 -i:9099 -i:9199 -i:9090 | xargs kill -9"
  }

一个用于启动模拟器,一个用于停止,以防 Ctr+C 没有停止后台进程。

这些是 firebase 文档页面中的默认端口。您还应该检查您的 firebase.json 文件并替换上一个命令中的 PORTS(如果它们不同)。


18
投票

如果你不想每次都检查端口,你可以用下面的命令停止

kill -9 (lsof -t -i:5002 -i:5001)

(-i:xxxx 是 firebase.json 中正在运行的模拟器端口。)

而且,我不想记住这么长的命令。 所以我在下面制作了 package.json 脚本。

"scripts": {
   ...
   "stop": "lsof -t -i :5001 -i:5002 | xargs kill -9",
   ...
}

6
投票

这是我刚刚发现的一些乐趣。当您想要关闭模拟器并清除所有端口和进程时,在运行模拟器的终端中双击 CTRL-C(按住 CTRL 并双击 C)。

我检查了几次,看看端口是否空闲,它们都是。

只需使用一次 CTRL-C 即可让所有这些端口仍在使用中。希望它能解决其他人的问题,而不仅仅是我。

编辑:现在看来,问题只会持续到设置模拟器后首次关闭计算机为止。我现在可以使用单个 CTRL-C 正确关闭模拟器。


5
投票

我已经尝试了上面的所有答案,但没有一个达到了我的预期:优雅地结束整个模拟器套件,而无需按 ctrl+c,不留下任何端口被占用。这是我解决的方法。

TLDR:

lsof -ti :4400 | xargs --no-run-if-empty kill

端口为 4400,因为它是模拟器集线器的默认端口。尽管使用此命令,无论您杀死哪个进程,您都会结束模拟器。

其他答案中使用的“-9”标志不会向进程发送 SIGTERM 信号,而是强制终止它。这会阻止模拟器正常结束。


5
投票

另一种方法是使用

firebase emulators:exec
,根据 CLI 文档,它可以执行以下操作:

启动本地 Firebase 模拟器,运行测试脚本,然后关闭模拟器

由于我将测试运行命令放入 Makefile 中,因此我使用以下命令从 Python

firebase_admin
SDK 测试 firestore:

firebase emulators:exec "make test" --only firestore

端口的设置和拆卸由firebase直接处理。


3
投票

如果您在项目中使用 Node,您可以调用

npx kill-port 3000 8080 9000 5001 5000 9199

您可以将其放入

package.json
中的脚本中,以便使用
npm run kill
轻松调用。

"scripts": {
  "kill": "npx kill-port 3000 8080 9000 5001 5000 9199"
}

3
投票

这是停止模拟器的一种方法:

pkill -f "firebase/emulators"

根据 Firebase 模拟器 SDK 文档(链接):

调用 emulators:start 会将模拟器下载到 ~/.cache/firebase/emulators/(如果尚未安装)。

所以,这个解决方案之所以有效,是因为:

  • 模拟器进程提供了一个 .jar 文件,位于此目录中
  • 由于这个jar路径在进程名中,所以pkill -f可以通过名称找到它

这比假设模拟器在哪些端口上运行的解决方案更强大,并且如果您有特定模拟器的多个实例正在运行,它就可以工作。


1
投票

对于 Windows,首先通过在 cmd 中输入以下内容来查找使用端口 8080 的进程的 PID。

netstat -a -n -o | find "8080"

接下来,通过以下方式终止该进程:

taskkill /PID <type PID here>

0
投票

查看源代码 命令模拟器-启动 命令模拟器-exec

两者都使用shutdownWhenKilled

export function shutdownWhenKilled(options: any): Promise<void> {
  return new Promise<void>((res, rej) => {
    ["SIGINT", "SIGTERM", "SIGHUP", "SIGQUIT"].forEach((signal: string) => {
      process.on(signal as Signals, processKillSignal(signal as Signals, res, rej, options));
    });
  }).catch((e) => {
    logger.debug(e);
    utils.logLabeledWarning(
      "emulators",
      "emulators failed to shut down cleanly, see firebase-debug.log for details.",
    );
    throw e;
  });
}

参见 processKillSignal 了解双信号的效果。

© www.soinside.com 2019 - 2024. All rights reserved.