2013-08-29 2 views
11

Возможно ли узнать местоположение файла .plist, которое загружается в команду launchctl?Как узнать конкретное местоположение файла launchd.plist?

Название ярлыка указано в списке «launchctl list», и его содержимое можно просмотреть с помощью «launchctl list LABEL», но я не могу найти местоположение файла .plist.

Я знаю, что он будет расположен в/Library/LaunchAgent или ~/Library/LaunchAgent или что-то в этом роде, , но я не хочу искать вокруг путей, пока все задания указаны в команде launchctl.

+0

Спасибо trojanfoe, я не знал о сайте! –

ответ

4

Название процесса, используемое в launchctl list, объявлено в виде plist. Хотя plist должен находиться в указанном выше месте, они могут быть практически в любом месте.

Я нашел плоскость, которую я искал, с «найти». Я искал org.postgresql.postgres locate *.plist | grep org.postgresql.postgres сузили его до 4 файлов

10

Эта проблема придумывает много и, к сожалению locate и mdfind оба не показывают результаты соответствующих каталогов на моей системе. Я поместил следующую функцию в свой .bashrc, чтобы быстро найти каталоги, в которых startctl ищет файлы 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 ищет файлы при загрузке и входе в систему. Он может не найти все, потому что задания могут быть вручную загружены пользователем и/или другими процессами.

+0

Лучше изменить «grep -r» на «grep -R», чтобы команда grep следила за символическими ссылками. – wukong

1

По Macos 10.12.6 (не уверен о более ранних версиях) можно вызвать: launchctl dumpstate и вы получите огромное количество информации обо всех запущенных процессах

Посмотрите на <LABEL> = { в качестве первой линии информации, касающейся к этой работе

Вот один лайнер, чтобы получить все активные демонами и их Plist пути:

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

0

с 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 
0

Вот команда, чтобы получить список всех загруженных .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

или другой вариант:

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

Объяснение:

  • find все .plist файлы в следующих местах: /System/Library/Launch*/Library/Launch*~/Library/Launch*
  • Используйте PlistBuddy команду для печати Label из всех найденных .plist файлов.
  • Используйте параметр -print параметра find, чтобы распечатать путь к этому файлу.
  • Извлечь другой список всех заданий, загруженных в launchd, и использовать их в качестве файла шаблонов для grep -f.
  • Отфильтруйте оба списка и найдите общие элементы и напечатайте их этикетку вместе с ее дорожкой (-A1).
Смежные вопросы