LaunchMon

LAUNCHD FIELD NOTES

Homebrew says “started,” but the service is not running

Inspect the launchd job and its configured logs; a registered service is not necessarily a healthy server.

Start in Terminal

These examples use a placeholder label. Substitute the exact Label from your own plist, not its filename.

brew services list
launchctl print "gui/$(id -u)/homebrew.mxcl.postgresql@16"

What to check next

Replace the label with the service you are investigating. If it was installed with sudo, inspect system/homebrew.mxcl.postgresql@16 instead. Read the plist’s StandardErrorPath and StandardOutPath. Confirm the actual port with lsof -nP -iTCP:5432 -sTCP:LISTEN.

Why it happens

A successful registration does not prove that the executable stays alive or accepts connections. Configuration errors, port conflicts, and missing data directories may cause an immediate exit.

User agents usually run in gui/<your uid>; system daemons run in system. The same label in different domains refers to different service registrations.

See it in LaunchMon

LaunchMon brings the plist, triggers, runtime state, and configured log paths together.

Inspect the launchd job and its configured logs; a registered service is not necessarily a healthy server.
LaunchMon with fictional demo services.

Download LaunchMon free trial

Related guides

References: Apple: creating launchd jobs. For commands on your macOS version, run man launchctl and man launchd.plist.