5

I have installed Postgres via Brew on a Mac. Then, I have tried to start it

| => brew services restart postgres
Stopping `postgresql`... (might take a while)
==> Successfully stopped `postgresql` (label: homebrew.mxcl.postgresql)
==> Successfully started `postgresql` (label: homebrew.mxcl.postgresql)

After that, I inspect to see if the process is running

(base) ________________________________________________________________________________
| ~/ @ MacBook-Pro (user) 
| => ps -ef | grep postgres
  501 61568   561   0  5:00PM ttys000    0:00.00 grep postgres

In addition, brew services produces the following

| => brew services
Name          Status  User Plist
dnsmasq       unknown root /Library/LaunchDaemons/homebrew.mxcl.dnsmasq.plist
emacs         stopped      
postgresql    error   root /Library/LaunchDaemons/homebrew.mxcl.postgresql.plist
postgresql@12 stopped      
rabbitmq      stopped      
unbound       stopped   

Any help on how to troubleshoot this is appreciated.

MadPhysicist
  • 5,401
  • 11
  • 42
  • 107

2 Answers2

11

Unlike a builtin pkg manger in Linux, Homebrew on macOS doesn't require root privilege during most brew command. The only exception is sudo brew services when you're starting a services listen on port < 1024.

Answer to your question: you messed up file permission with sudo brew services.

The solution works for x86 Mac. I've not tested it on M1 mac. (Homebrew stores related files under /usr/local on x86 Mac, under /opt/homebrew under M1 Mac.)

### Run in Bash or Zsh

# Stop postgresql
sudo brew services stop postgresql
# In case service file is copied to ~/Library/LaunchAgents as well
brew services stop postgresql

# Fix permission of homebrew files
sudo chown -R $USER:admin $(brew --prefix)/*

# Remove socket like `/tmp/.s.PGSQL.5432`

# Restart postgresql without sudo
brew services start postgresql

Besides above fix, you may also need to

  • Do a db migration from psql 12 -> psql 13, check brew info postgresl for detail
  • Start psql manually and check the start log
# Change /usr/local to /opt/homebrew on M1 Mac
# Check the start log
pg_ctl -D /usr/local/var/postgres start

# to stop it
pg_ctl -D /usr/local/var/postgres stop

sudo and brew

I'm not saying postgresql can't be started as root, but the Homebrew and brew services are not designed to work with sudo.

And sudo brew services changes some of the files' owner to root. You'd better change them back being owned by yourself.

Here's an example (check the Warning part)

❯ sudo brew services start adguardhome
Warning: Taking root:admin ownership of some adguardhome paths:
  /usr/local/Cellar/adguardhome/0.106.3/bin
  /usr/local/Cellar/adguardhome/0.106.3/bin/AdGuardHome
  /usr/local/opt/adguardhome
  /usr/local/opt/adguardhome/bin
  /usr/local/var/homebrew/linked/adguardhome
This will require manual removal of these paths using `sudo rm` on
brew upgrade/reinstall/uninstall.
Warning: adguardhome must be run as non-root to start at user login!
==> Successfully started `adguardhome` (label: homebrew.mxcl.adguardhome)

sudo brew services is not that intelligent enough to change the files' onwer bach to $USER automatically.

I've written a script to do this: brew-fix-perm. But this is not enough in your case. You have to change back the ownership of postgres configuration files under $(brew --prefix)/var/postgres. That's why I put sudo chown -R $USER:admin $(brew --prefix)/*.

Related Answer

Similar thing happened that another guy used sudo brew services starting MySQL. An additional detailed answer about how brew services works is there. You may wanna have a check.

Simba
  • 23,537
  • 7
  • 64
  • 76
-2

Short answer:

brew services stop postgresql
sudo chown -R $(whoami) $(brew --prefix)/*
brew services start postgresql
Ilya
  • 77
  • 1
  • 3