LaunchDaemons and privileged helpers on Mac: what they are and how to remove leftovers
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.
- Unload it, so it stops running:
For an agent in your ownsudo launchctl bootout system/com.example.app.helper~/Library/LaunchAgents, use your user domain instead:launchctl bootout gui/$(id -u)/com.example.app.agent. - Move the files to the Trash: the plist from
/Library/LaunchDaemonsand the helper from/Library/PrivilegedHelperTools. Finder will ask for your administrator password. Moving them to the Trash, rather than deleting them withrm, keeps an easy way back. - 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.
Related
- The full checklist for removing an app: how to completely uninstall apps on a Mac.
- Looking for an uninstaller? See Pearcleaner alternatives.
- Background services are also what keeps a Mac awake. See keep your Mac awake for the
pmset -g assertionstrick.
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.