如何关闭本地 Firebase 模拟器?

Posted

技术标签:

【中文标题】如何关闭本地 Firebase 模拟器?【英文标题】:How can I shut down the local firebase emulators? 【发布时间】:2020-10-22 08:46:23 【问题描述】:

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

$ firebase emulators:start

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

【问题讨论】:

【参考方案1】:
    检查哪个进程占用了sudo lsof -i tcp:<port> 端口 杀死进程kill -9 <process id>

【讨论】:

我发现如果你在没有关闭模拟器的情况下退出VSCode,它可以继续运行并且没有上述命令,你需要重新启动计算机才能重新启动模拟器。感谢您分享@xmkevinchen 对于 Windows:***.com/a/39633428/681803 @ra9r 在 linux 上这个进程被称为 java。如果你杀了它,你就不需要重启你的电脑了。 我很惊讶没有关机命令...这是一个疯狂的工作流程。 这似乎是一个显而易见的功能,可以包含在命令firebase emulators:stop 或类似的命令中,这让我觉得我使用了错误的工具。启动模拟器并让它们在后台运行并长时间开发的正常工作流程吗?【参考方案2】:

据此:https://github.com/firebase/firebase-tools/issues/1367 Ctrl+C 杀死模拟器

【讨论】:

【参考方案3】:

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

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",
   ...

【讨论】:

【参考方案4】:

一个跨平台的解决方案是运行:npx kill-port 4000,8080,8085

【讨论】:

【参考方案5】:

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

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

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

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

【讨论】:

这是给我的,虽然 --no-run-if-empty 在 macOS 上是假的【参考方案6】:

另一种方法是使用firebase emulators:exec,根据 CLI 文档,它是这样做的:

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

由于我将测试运行命令放在 Makefile 中,因此我使用以下命令从 Python firebase_admin SDK 测试 firestore:

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

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

【讨论】:

【参考方案7】:

对于 Windows,首先在 cmd 中键入使用端口 8080 的进程的 PID。

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

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

taskkill /PID <type PID here>

【讨论】:

【参考方案8】:

如果你想杀死所有的 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。

【讨论】:

【参考方案9】:

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

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

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

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

【讨论】:

以上是关于如何关闭本地 Firebase 模拟器?的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 pubsub 模拟器在本地调用 firebase Schedule 函数

初始化firebase模拟器存储

Flutter + firebase:配置应用程序以使用本地 firebase 模拟器

使用 firebase 模拟器时如何共享指向 firebase 开发环境的链接?

Firebase 云功能本地代码更改未反映在模拟器中

Firebase 函数不会看到 pubsub 模拟器在本地运行