26

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.

4

8 回答 8

16

从 macOS 10.12.6(不确定早期版本)开始,可以调用:launchctl dumpstate并且您将获得有关所有正在运行的进程的大量信息

寻找<LABEL> = {与该工作有关的第一行信息

这是获取所有活动守护程序及其 plist 路径的单一方法:

grep -B 1 -A 4 "active count = 1$" <<< "$(launchctl dumpstate)"

更新:由于 10.12 macOS 添加了其他值,因此 grep-A n已增加到 4 行

于 2017-09-20T05:25:03.397 回答
14

这个问题出现了很多,不幸的是locatemdfind两者都没有显示我系统上相应目录的结果。我将以下函数放入我的.bashrc,以便我可以快速搜索launchctl 查找plist 文件的目录。

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;
}

请注意,这只检查在launchctl启动和登录时查找文件的目录。它可能无法找到所有内容,因为作业可以由用户和/或其他进程手动加载。

更新:对于那些运行 macOS 10.12.6 或更高版本的用户,我建议使用 Joel Bruner 的解决方案。

于 2015-03-06T21:15:58.477 回答
4

中使用的进程名称launchctl list在 plist 中声明。虽然 plist 应该在上面提到的位置,但它们几乎可以在任何地方。

我找到了我正在寻找的 plist 和'locate。我正在寻找 org.postgresql.postgres locate *.plist | grep org.postgresql.postgres 将其缩小到 4 个文件

于 2014-01-11T02:00:06.163 回答
4
于 2019-11-03T04:11:09.947 回答
3

这是列出所有加载.plist的文件及其对应文件的命令:

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

或其他版本:

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

解释:

  • find.plist以下位置的所有文件:/System/Library/Launch* /Library/Launch* ~/Library/Launch*
  • 使用PlistBuddy命令打印Label所有找到的.plist文件。
  • 使用-print参数 offind打印该文件的路径。
  • 获取加载到的所有作业的另一个列表,launchd并将其用作grep -f.
  • 过滤两个列表并找到公共元素并打印其标签及其路径 ( -A1)。
  • 过滤通过strings以避免打印二进制文件。
于 2018-01-11T21:27:21.777 回答
2

由于launchctl list列出 PID,一种方法是使用lsof命令查看进程的所有加载文件,例如

launchctl list | grep -o '^[0-9]\+' | xargs -n1 lsof -p | grep plist$

另一种方法是运行fs_usage命令并重新加载.plist文件,例如

sudo fs_usage | grep -w launchd | grep -w plist
于 2018-01-11T21:15:45.867 回答
1

在最新版本的 macOS 中,您可以使用该launchctl print命令。您必须知道它在哪个域下运行,例如systemgui/<uid>. 您可以在手册页中找到其他一些域,但到目前为止,我只看到在这两个域下运行的服务。例子:

% 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

我相信这个命令是在 High Sierra 或附近实施的。

于 2020-12-22T15:19:57.320 回答
0

在 Catalina 上,我设计了这个脚本来打印在system域或登录用户中找到的所有正则表达式匹配对象的 plist。请注意,这是一个 BASH 脚本,但也适用于我的 ZSH 测试。

用法:find_loaded_plist [ regex ]

请在下面的评论中报告错误/建议。

find_loaded_plist() {
     launchctl list  | 
     awk "NR>1 && /${1:-^}/  { print \$3 }"  | 
     while read name; do
             launchctl print system/$name 2>/dev/null | 
                sed -n 's/^[[:space:]]*path = //p'
             for u in $(users |xargs id -u ) ; do                                 
                  launchctl print uid/$u/$name 2>/dev/null |
                     sed -n 's/^[[:space:]]*path = //p'
             done;
     done; 
}
于 2021-03-19T11:44:35.357 回答