How to see and stop background services on a Mac

Background services on a Mac are jobs managed by launchd, the program that starts and stops everything else. You can list them in Terminal with launchctl list, and you can stop one with a launchctl command, but many macOS ones start again by themselves and stopping the wrong one can cause trouble. In Foreman, the Services page shows the same jobs with Start, Stop and Restart buttons, and asks for your administrator password for system ones.

This post explains what a service is, how to look at them with macOS’s own tools, how to stop one, and when to leave a service alone.

What a background service is

Most of what runs on your Mac is not an app you opened. Behind the scenes there are programs that index files for search, sync with iCloud, check for software updates, manage Bluetooth and Wi-Fi, and much more. They have no window. They run in the background and do one job.

macOS keeps these jobs organised through launchd. It is the first process the kernel starts (it has process ID 1) and it starts every other process, which is why it is described as the service launcher. Most jobs it manages are described by a settings file called a property list, and the job is either a launch agent, which runs for you as a user, or a launch daemon, which runs for the whole system. Launch agents and daemons explained in plain English goes through the difference.

Some services run all the time. Others start when something asks for them, do their work and stop. So a service that is not running at the moment is not necessarily broken or switched off: launchd may simply be waiting for a reason to start it.

See them with Terminal

Terminal can list the jobs launchd knows about for your login:

launchctl list

The output has three columns: a process ID if the job is running right now (a dash if not), the exit status of its last run, and the job’s label. Labels are usually in reverse-domain form, such as the name of the company followed by the name of the job, so you can often tell which app a job belongs to.

To look at a single job in detail, use launchctl print with a domain and label, for example launchctl print gui/501/ followed by the label. The number is your user ID, which the id -u command shows. If you only want to find a running process by name, pgrep -l followed by part of a name lists matches.

The files that define the jobs live in a few folders. Agents for you alone are in the LaunchAgents folder in your Library. Agents for every user are in /Library/LaunchAgents, and daemons are in /Library/LaunchDaemons. macOS’s own jobs are in /System/Library, which you cannot change. Browsing these folders in Finder is read-only and safe, but do not edit or delete anything in them unless you know what the file belongs to.

Stop a service

The command line has a few ways to stop a job, and it is worth knowing the difference between them.

launchctl stop followed by a label asks a running job to stop. If the job is set to keep itself alive, launchd starts it again straight away, which is why many services appear to come back as soon as you stop them.

launchctl bootout takes the job out of launchd until it is loaded again, which for most jobs means the next login or restart. launchctl disable records that the job must not be loaded, and that lasts across restarts until you run launchctl enable with the same target. Both need the right domain in the command, such as gui/ with your user ID for your own jobs, or system/ with sudo for daemons, which is why they trip people up. A typo here either does nothing or affects something you did not intend, and macOS refuses some of them for its own protected jobs.

If the service belongs to an app, the better way is almost always to use the app’s own setting, or to switch off the app’s background item in System Settings, under General > Login Items & Extensions (Login Items on macOS 14), in the “Allow in the Background” list. That way the app and macOS agree about what is allowed to run.

For a job that is stuck or misbehaving, restarting it is often enough. A restart stops the job and lets launchd start it fresh, and that fixes many problems without removing anything. In Terminal, launchctl kickstart -k followed by the domain and label does this.

Which services to leave alone

Many services are part of macOS and do work you rely on. Examples include the ones that handle Wi-Fi, Bluetooth, sound, notifications, security checks, Spotlight, iCloud and Time Machine. Stopping them can mean no sound, no network or search that stops working until the Mac restarts or launchd brings the service back.

Some should never be ended at all. launchd itself and kernel_task are core to macOS, and ending loginwindow logs you out. A simple rule applies: if you do not know what a service does, do not stop it. Look it up first, and if it belongs to macOS, assume it is needed. macOS also restarts many of its own services automatically, so stopping one is often temporary anyway.

The services you might reasonably stop are the ones that belong to apps you installed: an updater you do not want, a sync helper for a service you no longer use, or the background helper of an app you have decided to stop using. If the app is still installed, the cleaner move is to quit it or remove it from login, as above.

The Services page in Foreman

Foreman is a Task Manager for macOS, and one of its six pages is Services. It lists macOS’s background services, the launchd jobs for you and for the system, whether they are running or not. For each one you can Start, Stop or Restart it. System services need an administrator password, and Foreman asks for it before it acts.

It shows the same launchd jobs that Terminal does, for you and for the system, in a window where the running ones are easy to tell from the idle ones, and you do not have to remember the domain syntax. Foreman also knows plain-English names for about 120 macOS processes, so a cryptic name can be read as, for example, “Spotlight indexing” with the real name beside it in grey. That is on the Processes page, and it helps you decide whether a job is something to leave alone.

A few honest limits. Foreman does not stop services on a schedule, does not set rules for them and does not warn you when one is busy. It is a manual tool: you open it, look and choose. It also cannot make a macOS service safe to stop, so the caution above applies in the Services page exactly as it does in Terminal. It costs $12 once and is free for 24 hours, and Terminal can do everything described here if you prefer.

A sensible way to work through it

  1. Start from a symptom, not from the list. A service worth looking at is one that is using a lot of CPU or memory, or one you cannot explain.
  2. Find out what it is. If it belongs to macOS, leave it unless a restart is the fix. If it belongs to an app, decide whether you still want the app.
  3. Prefer the app’s own setting or the “Allow in the Background” switch to a manual stop.
  4. If you stop something and a feature breaks, start it again or restart the Mac. Nothing here deletes anything. If you used launchctl disable, run launchctl enable with the same target first, because a restart does not undo it.

For a process that is busy and you want to know why, how to find out what is running in the background on your Mac is the place to begin.