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 viewed by "launchctl list LABEL", but I cannot find the .plist file location.
I know it will be located in /Library/LaunchAgent or ~/Library/LaunchAgent or something, but I don't want to search around paths while all jobs is listed with the launchctl command.
This issue comes up a lot and unfortunately locate and mdfind both don't show results from the appropriate directories on my system. I put the following function in my .bashrc so I could quickly search the directories where launchctl looks for plist files.
launchctlFind () {
LaunchctlPATHS=( \
~/Library/LaunchAgents \
/Library/LaunchAgents \
/Library/LaunchDaemons \
/System/Library/LaunchAgents \
/System/Library/LaunchDaemons \
)
for curPATH in "${LaunchctlPATHS[@]}"
do
grep -r "$curPATH" -e "$1"
done
return 0;
}
Note that this only checks in the directories where launchctl looks for files at boot-up and login. It may not find everything because jobs can be manually loaded by the user and/or other processes.
UPDATE: For those running macOS 10.12.6 or higher I would recommend using Joel Bruner's solution below.
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)"
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
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:
findall.plistfiles in the following locations:/System/Library/Launch*/Library/Launch*~/Library/Launch*- Use
PlistBuddycommand to printLabelof all found.plistfiles. - Use
-printparameter offindto print the path to that file. - Fetch another list of all the jobs loaded into
launchdand use as pattern file forgrep -f. - Filter both lists and find the common elements and print its label along with its path (
-A1). - Filter via
stringsto avoid printing binary 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
来源:https://stackoverflow.com/questions/18502705/how-to-know-a-specific-launchd-plist-file-location