Is it possible to know the .plist file location which is loaded into the launchctl command?
The label name is listed with \"launchctl list\" and its contents can be view
In recent versions of macOS you can use the launchctl print
command. You have to know which domain it's running under, e.g. system
or gui/<uid>
. There are a few other domains you can find in the man page, but so far I have only seen services running under these two. Examples:
% launchctl print gui/$(id -u)/com.apple.cloudphotod | grep path
path = /System/Library/LaunchAgents/com.apple.cloudphotod.plist
% launchctl print system/com.openssh.sshd | grep path
path = /System/Library/LaunchDaemons/ssh.plist
stderr path = /dev/null
I believe this command was implemented in High Sierra or thereabouts.
As of macOS 10.12.6 (not sure about earlier versions) it is possible to invoke: launchctl dumpstate
and you will get a wealth of information about all running processes
Look for <LABEL> = {
as the first line of info pertaining to that job
Here's a one liner to get all the active daemons and their plist paths:
grep -B 1 -A 1 "active count = 1$" <<< "$(launchctl dumpstate)"
Here is the command to list all loaded .plist
files and their corresponding files:
find /System/Library/Launch* /Library/Launch* ~/Library/Launch* -name '*.plist' -exec sh -c '/usr/libexec/PlistBuddy -c "Print Label" {} && echo {}' ';' | grep -wf <(launchctl list | grep -o "\S\+\..*$") -A1 | strings
or another version:
find /System/Library/Launch* /Library/Launch* ~/Library/Launch* -name '*.plist' -exec /usr/libexec/PlistBuddy -c "Print Label" {} ';' -print | grep -wf <(launchctl list | grep -o "\S\+\..*$") -A1 | strings
Explanation:
find
all .plist
files in the following locations: /System/Library/Launch*
/Library/Launch*
~/Library/Launch*
PlistBuddy
command to print Label
of all found .plist
files.-print
parameter of find
to print the path to that file.launchd
and use as pattern file for grep -f
.-A1
).strings
to avoid printing binary files.The process name used in launchctl list
is declared in a plist. While the plist should be at the location mentioned above, they can be almost anywhere.
I found the plist i was looking for with' locate. I was looking for org.postgresql.postgres
locate *.plist | grep org.postgresql.postgres
narrowed it down to 4 files
Since launchctl list
list PIDs, one method is to use lsof
command to see all loaded files of the process, e.g.
launchctl list | grep -o '^[0-9]\+' | xargs -n1 lsof -p | grep plist$
Another way is to run fs_usage
command and re-load the .plist
file, e.g.
sudo fs_usage | grep -w launchd | grep -w plist
This question might have has no answer! It seems that not everything in launchctl list
will have a plist file at all.
As mentioned, launchctl dumpstate
will give you tons of info on things including the plist path, if it exists.
You can run this command to approximately see a list of everything running and its plist path.
launchctl dumpstate | grep -A4 " = {" | grep -B 3 -A 3 -E "active count = [1-9]"
(Though this also seems to include other programs running that aren't daemons managed by launchd?)
The agents/daemons will have a path field underneath their identifier. Usually, the paths point to a plist file in the standard 5 locations described by Reed's answer. However, it doesn't have to be. For example Steam loads a launchctl service from a nonstandard location.
➜ launchctl dumpstate | grep -A4 " = {" | grep -B 3 -A 3 -E "active count = [1-9]" | grep valve
com.valvesoftware.steam.ipctool = {
path = /Users/chris/Library/Application Support/Steam/com.valvesoftware.steam.ipctool.plist
Fortunately that practice isn't too popular so searching the standard locations is usually sufficient.
But that's not the trickiest thing. I don't know the specifics but it appears that launchctl
services can be loaded without a corresponding plist file at all. For example, this is what dumpstate says for the 1Password helper daemon.
➜ launchctl dumpstate | grep -A4 " = {" | grep -B 3 -A 3 -E "active count = [1-9]" | grep -A4 "onepassword7-helper = {"
2BUA8C4S2C.com.agilebits.onepassword7-helper = {
active count = 5
path = (submitted by smd.1154)
state = running
I don't know what "submitted by smd" really means, but it boils down to even if I see a helper in launchctl list
there might not be any plist on the filesystem. Because of this I don't know how to launchctl unload
this service because unload requires a plist path! And since this process is managed by launchd
, even if I pkill -9 onepassword7-helper
, launchd
sees that the process stopped and starts it right back up again.
(fortunately for this particular 1Password example, if you hold ^
and ⌥
when clicking Quit 1Password, a special "Quite 1Password Completely" option will appear)