← Mac Change Notes

LaunchAgent File Exists: Is It Running?

A LaunchAgent plist on disk does not prove that its process is running. Start with Activity Monitor. To distinguish an idle loaded job from an unregistered one, inspect the job's label in the correct launchd domain.

In this article

This distinction matters when a helper appears in a folder or a startup inventory but seems absent from the process list. Reinstalling the app, deleting the plist or forcing the job to start can change the situation before you understand it. First record what exists, what is registered and what is active at the time of your check.

Start with the process question

Open Activity Monitor, choose View → All Processes, and search for the helper or executable name. Apple's process-viewing guide explains the available views.

Use the executable's name when you know it. A launchd label, a plist filename and a process name need not be identical. If the entry appears, inspect its process ID and the user running it. If it does not appear, you have a narrower observation: you did not find that process in this view at this moment. A short-lived helper may have already finished.

The settings that open an app at login or allow background activity describe different controls. An enabled switch is not a live record of process execution. Likewise, a loaded job may be waiting for the event that should start it.

Read the configuration without starting the job

For a traditional LaunchAgent plist, use Terminal to inspect the file as data:

plutil -p "/path/to/example.plist"

Replace the example with the actual path and retain the quotes. Look for Label, Program or ProgramArguments, and the conditions that request execution. Use the value of Label for the service lookup below, rather than guessing from the filename.

A second read-only check is:

plutil -lint "/path/to/example.plist"

A successful syntax check means the file can be parsed as a property list. It does not confirm that launchd accepted it, that its executable exists, that permissions allow the executable to work, or that the service is running.

Apple's archived launchd job guide describes the configuration and on-demand model. Conditions such as a schedule or a requested service can determine when a job starts; loading the configuration need not leave a permanent process.

If you do not yet know whose component this is, first trace the background item to its owner. Reading an unfamiliar command is different from running it.

Ask launchd about the right label and domain

For a LaunchAgent in your current graphical login session, substitute the actual label here:

launchctl print "gui/$(id -u)/com.example.helper"

For a system LaunchDaemon, the corresponding form is:

launchctl print "system/com.example.helper"

These commands inspect state; they do not load, unload or start the service. Apple's Terminal guide to launchd introduces the native tool. Run man launchctl locally for the service-target forms supported by your installed macOS.

The domain is part of the question. A system daemon is not the same target as a user agent with a similar label. Another user's agent, or a service in a different session, is outside the scope of a lookup aimed at your graphical session.

Read the returned state and, when present, the PID. A successful service lookup with no active PID can describe a job that is registered but currently idle. A “could not find service” result can mean the label is absent from that domain; it does not establish that the plist is absent from disk or that the app was uninstalled.

Preserve the exact error when the lookup fails. A wrong domain, wrong label or access problem requires a different next step from a registered job whose executable repeatedly fails. The output is a diagnostic snapshot, not a stable format to turn into a permanent monitoring parser.

What our controlled test showed

We tested these distinctions on macOS 15.7.5 on October 4, 2026 using a temporary job of our own. Its command was /bin/sleep 30; RunAtLoad and KeepAlive were both false. The plist stayed outside the normal LaunchAgents folders, so the experiment did not install a persistent login item.

We inspected it before registration, registered it, deliberately started it, and removed that registration. No existing app's service was changed.

Test stageWhat we observed
File created and syntax checkedFile present; service not found in our GUI domain; no test process
Job registered, before starting itFile present; state = not running; no PID reported
Test job explicitly startedFile present; state = running; PID reported
Our registration removedFile still present; service not found again; test process stopped

We then removed the temporary files. The useful result is the separation: the same valid file existed through all four observations, while registration and runtime state changed.

This was a controlled launchd test on one macOS version, not a test of every vendor's helper or every background-management mechanism. It also does not show that any real app's idle helper is broken. A helper designed to run briefly may be behaving correctly when it has no current process.

Choose the next step from the evidence

If the job is loaded but idle, compare its documented trigger with what you were doing. Open the relevant feature in the app through its normal interface, then check again. Do not change KeepAlive simply to make a process remain visible.

If the job is running but the feature fails, record the PID, time, executable path and actual error. A running process is evidence of execution, not proof that the feature works.

If the file exists but the lookup fails, verify the label and domain first. Then consult the app's current setup or troubleshooting instructions. Avoid deleting files or repeatedly reinstalling based on that lookup alone.

VaultDog can help connect discovered startup files with their likely installed app. Keep that association separate from the runtime evidence above: a related file is not, by itself, proof of an active process or permission to remove it.