Currently I initialise the firebase emulators with:
$ firebase emulators:start
After some time working on it I want to stop it. How can I then stop the emulators?
Currently I initialise the firebase emulators with:
$ firebase emulators:start
After some time working on it I want to stop it. How can I then stop the emulators?
sudo lsof -i tcp:<port>
kill -9 <process id>
according to this: https://github.com/firebase/firebase-tools/issues/1367 Ctrl+C
kills the emulators
One cross-platform solution is to just run kill-port :
npx kill-port 4000 8080 8085
If you wanna kill all firebase emulators you can easily do that by firing this command
$ lsof -t -i:8080 -i:9000 -i:9099 -i:9199 -i:9090 | xargs kill -9
When you don't want to type this long command each time I advise you to use a script in the package.json file
"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"
}
One for starting your emulators and one for stopping, in case Ctr+C didn't stop the processes in the background.
Those are the default PORTS from the documentation page in firebase. You should also check your firebase.json file and replace the PORTS in the previous command if they are different.
If you don't want to have to check the port every time, you can stop command with below
kill -9 (lsof -t -i:5002 -i:5001)
(-i:xxxx are your running emulator ports in firebase.json.)
Moreover, I don't want to memorize this long command. So I made package.json script below.
"scripts": {
...
"stop": "lsof -t -i :5001 -i:5002 | xargs kill -9",
...
}
So here's a bit of fun I just discovered. Double tap CTRL-C (hold down CTRL and double tap C) in the terminal running the emulator when you want to shut down the emulator and clear all the ports and processes.
I've checked it a couple of times and looked to see if the ports are free, they all are.
Just using CTRL-C once leaves you with all those ports still being used. Hope it solves the problem for others and not just me.
Edit: Looks to me now like the problem only persists until first shutdown of the computer after setting up the emulators. I now have no problems with the emulators shutting down properly with a single CTRL-C.
I've tried all the answers above, and none does what I was expecting: to gracefully end the emulator suite as a whole without having to ctrl+c, leaving no ports occupied. Here is how I've solved it.
TLDR: lsof -ti :4400 | xargs --no-run-if-empty kill
The port being 4400, as it's the default port for the Emulator Hub. Although with this command you'll end the emulator regardless of the process you kill.
The"-9" flag used in the other answers does not send the SIGTERM signal to the process, but forcefully kills it instead. This prevents the emulator from ending gracefully.
An alternative is to use firebase emulators:exec
, which, according to the CLI documentation, does this:
start the local Firebase emulators, run a test script, then shut down the emulators
Since I put my test running command in a Makefile, I use the following command to test firestore from a Python firebase_admin
SDK:
firebase emulators:exec "make test" --only firestore
The set-up and tear-down of the port is handled by firebase directly.
If you're using Node in your project you can call
npx kill-port 3000 8080 9000 5001 5000 9199
You can put this into a script in your package.json
to easily call with npm run kill
.
"scripts": {
"kill": "npx kill-port 3000 8080 9000 5001 5000 9199"
}
For Windows, first find PID of the process using port 8080 by typing this in cmd.
netstat -a -n -o | find "8080"
Next, kill that process by:
taskkill /PID <type PID here>
Here's one way you can stop the emulators:
pkill -f "firebase/emulators"
According to the Firebase Emulators SDK documentation (link):
Calling emulators:start will download the emulators to ~/.cache/firebase/emulators/ if they are not already installed.
So, this solution works because:
This is more robust than solutions that make assumptions about what ports the emulator is running on, and it works if you have multiple instances of a specific emulator running.