Mac guides

LaunchDaemons and privileged helpers on Mac: what they are and how to remove leftovers

By Qiffe · Tested on macOS 27.0.1,

Some apps install more than an app. VPNs, backup tools, virtual cameras, audio drivers and updaters often add background services that start automatically: launch daemons, launch agents and privileged helper tools. When you drag the app to the Trash, those usually stay. Some keep running.

On a test Mac we checked, an app had been deleted, but its helper was still in /Library/PrivilegedHelperTools and its launch daemon was still registered with the system.

Where they live

macOS’s launchd loads services from these folders (from man launchd.plist):

Folder What it holds Runs as
~/Library/LaunchAgents Agents installed for your user You
/Library/LaunchAgents Agents installed by an app for every user Each logged-in user
/Library/LaunchDaemons System-wide daemons installed by apps root, unless the plist sets another user
/System/Library/LaunchAgents, /System/Library/LaunchDaemons Apple’s own Leave these alone; they’re protected

Privileged helper tools live in /Library/PrivilegedHelperTools. A daemon plist in /Library/LaunchDaemons usually points to one of them.

See what’s installed

In System Settings

Open System Settings > General > Login Items & Extensions:

  • Open at Login lists apps that start when you log in.
  • Background App Activity lists background items and which app added them; you can switch them off here.
  • Extensions covers system extensions such as virtual cameras.

In Terminal

ls ~/Library/LaunchAgents /Library/LaunchAgents /Library/LaunchDaemons /Library/PrivilegedHelperTools

Each .plist file is named after its label, usually the developer’s reverse domain, such as com.example.app.helper. To see whether a daemon is loaded:

launchctl print system/com.example.app.helper

If it’s loaded, you’ll see its state and the program it runs. If it isn’t, launchctl says it could not find the service.

Is the app still there?

Check whether the app that installed it still exists. Spotlight can search by bundle ID:

mdfind "kMDItemCFBundleIdentifier == 'com.example.app'"

No result usually means the app is gone and the daemon is a leftover.

Remove a leftover daemon safely

Only do this for services you’ve identified as belonging to an app you no longer use.

  1. Unload it, so it stops running:
    sudo launchctl bootout system/com.example.app.helper
    For an agent in your own ~/Library/LaunchAgents, use your user domain instead: launchctl bootout gui/$(id -u)/com.example.app.agent.
  2. Move the files to the Trash: the plist from /Library/LaunchDaemons and the helper from /Library/PrivilegedHelperTools. Finder will ask for your administrator password. Moving them to the Trash, rather than deleting them with rm, keeps an easy way back.
  3. Check that launchctl print system/<label> no longer finds it.

Never remove anything from /System, and don’t remove a daemon whose app you still use. That app may stop working, or reinstall it on next launch.

Do it with Doff

Doff, our uninstaller, looks for exactly these leftovers. Its Left behind view lists launch daemons and helpers whose app is gone, and notes that they can keep running as root.

It stops running helpers first, then moves everything to the Trash, with History to put things back. Items outside your home folder go through a small helper you approve once in System Settings. The scan is free.

Questions

Is it safe to delete files in /Library/LaunchDaemons?

Only ones that belong to an app you no longer use. They're installed by third-party apps (Apple's live in /System/Library/LaunchDaemons). Unload the service first with launchctl bootout, then move the plist and its helper to the Trash rather than deleting them.

What is /Library/PrivilegedHelperTools?

It's where apps put small helper programs that do tasks needing administrator rights, such as a VPN changing network settings. A launch daemon starts the helper, usually as root. When you delete the app, the helper and its daemon often stay behind.

What's the difference between LaunchAgents and LaunchDaemons?

Launch agents run on behalf of a logged-in user. Launch daemons are system-wide and, unless their plist names another user, run as root, even when nobody is logged in.