Skip to content
AppVerz

Blog / 15 November 2026

Homebrew services you forgot you started: finding them, stopping them, and keeping them stopped

brew services start does two things: it starts the service now and starts it again every time you log in. That is how Postgres, MySQL and Redis end up running for months on a Mac you only use for one project a week. How to list them, stop them properly, and run them only when you need them.

By AppVerz4 min read
Stackyard's Docker section: ten containers of one Compose project with image, uptime, health, ports and memory, and Stop All and Start All buttons for the project.

You needed Postgres for a side project two years ago. You ran brew services start postgresql@14, it worked, and you moved on. It has started every time you have logged in since. So has the Redis from a tutorial, and the MySQL from a client job you finished last spring.

None of this shows up anywhere obvious. There is no Dock icon and no window, and in Activity Monitor it is one more process with a short name. It shows up as memory you cannot account for, and as port 5432 is already in use when a Docker container tries to start the database it wants.

Why they keep running

Homebrew services are a thin layer over launchd, the part of macOS that starts things at login and restarts them when they stop.

  • brew services start <name> starts the service and writes a launch agent to ~/Library/LaunchAgents/homebrew.mxcl.<name>.plist. From then on, launchd starts it every time you log in.
  • sudo brew services start <name> writes a launch daemon to /Library/LaunchDaemons instead. That one starts at boot, before anyone logs in.
  • Most of these files tell launchd to keep the service alive. If you kill the process from Activity Monitor or with kill, launchd starts it again a moment later.

That last point is why "I killed it and it came back" is such a common complaint.

Find what is running

brew services list

You get one line per service with its status:

Status Meaning
started Running, and registered to start at login (or boot, with sudo)
stopped Registered, but not running right now
none Installed, not registered, not running
error Registered but failed to start. The exit code is shown

Check root services too, because they are listed separately:

sudo brew services list

And to see which ports they are holding:

lsof -iTCP -sTCP:LISTEN -n -P

Postgres usually sits on 5432, MySQL on 3306 and Redis on 6379. Port already in use covers what to do when one of them blocks something else.

Stop them properly

brew services stop postgresql@14

This stops the service and removes its launch agent, so it stays stopped after a restart. Use sudo for anything that was started with sudo. If you have several, brew services stop --all stops every one of them.

Two other commands are useful:

  • brew services cleanup removes launch agents left behind for services you have already uninstalled.
  • brew uninstall <name> removes a service you will never use again. Your data directory is usually left in place under $(brew --prefix)/var, so delete that separately if you want the space back, and only after checking you do not need the data.

Run them only when you need them

For a database you need for one project, use run instead of start:

brew services run postgresql@16

It starts the service now without registering it. Log out or restart and it is gone. When you are finished for the day, brew services stop postgresql@16 stops it at once. This one habit stops services piling up.

What they cost

Idle, a single Postgres or Redis uses little memory and almost no CPU. The cost adds up because there are several of them, because they run every day, and because some use much more than others:

  • MySQL reserves a buffer pool at startup and often sits at a few hundred megabytes doing nothing.
  • Elasticsearch and OpenSearch run on Java and reserve a heap, often a gigabyte or more.
  • Ollama is small until a model is loaded. Then it holds that model in memory, often several gigabytes, until it has been idle for a while.

On a 16 GB Mac that might not matter. On an 8 GB one it is the difference between a smooth day and a swapping one. Web development on an 8 GB Mac covers that case.

Doing it with Stackyard

brew services does the job, but only if you remember to run it. Stackyard puts the same information where you will see it.

  • Homebrew services get an on/off switch in the Docker section (⌘6), next to your containers. MySQL, Postgres, Redis and the rest, each with its status, switched through Homebrew's own command-line tool. You do not need to remember the exact name, such as postgresql@14.
  • Localhost lists every port in use, with a blue dot for servers that are not web servers, such as Postgres and Redis. You can see what is holding 5432 without running lsof.
  • Memory shows what each service is using, beside your other apps.
  • Startup, under Clean, lists launch agents and daemons with whether each is running and whether it starts at login or restarts when quit. The homebrew.mxcl files show up there, so a service you forgot about is easy to spot.
  • Guard can quit orphan dev processes automatically, but it deliberately leaves databases and background services such as Postgres, Redis, Ollama and nginx alone. Stopping those stays your decision. Orphan dev processes explains the difference.

Stackyard does not uninstall services or delete their data. That stays with brew.

Stackyard is free for three days, then from $21 once for one Mac, with no subscription. Download it from its page.

Questions people ask

How do I see which Homebrew services are running?
Run brew services list. It shows every service Homebrew knows about with its status (started, stopped, none or error), the user it runs as, and the launchd file that starts it.
What is the difference between brew services start and brew services run?
start runs the service now and registers it with launchd, so it starts again every time you log in. run starts it now only, and it will not come back after a restart or logout. Use run for a database you need for one project today.
Why does my Homebrew service start again after I kill it?
Because launchd is told to keep it alive. Killing the process with kill or Activity Monitor only makes launchd start it again. Use brew services stop, which unregisters it and stops it.

Related reading

Have a question about any of this?

Write in. The person who built the apps reads every message and replies within two working days.