web-dev-qa-db-ja.com

特定のlaunchd.plistファイルの場所を知る方法は?

Launchctlコマンドにロードされている.plistファイルの場所を知ることは可能ですか?

ラベル名は「launchctllist」でリストされており、その内容は「launchctl list LABEL」で表示できますが、.plistファイルの場所が見つかりません。

/ Library/LaunchAgentまたは〜/ Library/LaunchAgentなどに配置されることはわかっていますが、launchctlコマンドですべてのジョブが一覧表示されている間は、パスを検索したくありません。

18

この問題は頻繁に発生しますが、残念ながら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が起動時とログイン時にファイルを探すディレクトリのみをチェックインすることに注意してください。ユーザーや他のプロセスがジョブを手動でロードできるため、すべてが見つからない場合があります。

14
Reed Espinosa

MacOS 10.12.6以降(以前のバージョンについては不明)、次を呼び出すことができます:_launchctl dumpstate_そして、実行中のすべてのプロセスに関する豊富な情報を取得します

その仕事に関連する情報の最初の行として_<LABEL> = {_を探します

これは、すべてのアクティブなデーモンとそのplistパスを取得するための1つのライナーです。

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

5
Joel Bruner

launchctl listで使用されるプロセス名は、plistで宣言されています。 plistは上記の場所にあるはずですが、ほとんどどこにでも置くことができます。

私が探していたplistを見つけました。 org.postgresql.postgresを探していましたlocate *.plist | grep org.postgresql.postgresそれを4つのファイルに絞り込みました

4
user2548919

ロードされたすべての_.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コマンドを使用して、見つかったすべての_.plist_ファイルのLabelを出力します。
  • findの_-print_パラメータを使用して、そのファイルへのパスを出力します。
  • launchdにロードされたすべてのジョブの別のリストを取得し、_grep -f_のパターンファイルとして使用します。
  • 両方のリストをフィルタリングし、共通の要素を見つけて、パス(_-A1_)とともにラベルを印刷します。
  • バイナリファイルの印刷を回避するには、stringsでフィルタリングします。
3
kenorb

launchctl listはPIDを一覧表示するため、1つの方法は、lsofコマンドを使用して、プロセスのロードされたすべてのファイルを表示することです。

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

もう1つの方法は、fs_usageコマンドを実行し、.plistファイルを再ロードすることです。

Sudo fs_usage | grep -w launchd | grep -w plist
1
kenorb

この質問には答えがないかもしれません! launchctl listのすべてにplistファイルがあるわけではないようです。

前述のように、launchctl dumpstateは、plistパスが存在する場合は、それを含む多くの情報を提供します。

このコマンドを実行すると、実行中のすべてのリストとそのplistパスをおおよそ見ることができます。

launchctl dumpstate | grep -A4 " = {" | grep -B 3 -A 3 -E "active count = [1-9]"

(これには、launchdによって管理されていないデーモンが実行されている他のプログラムも含まれているようですが?)

エージェント/デーモンには、識別子の下にパスフィールドがあります。通常、パスは、 リードの回答 で記述された標準の5つの場所にあるplistファイルを指します。ただし、そうである必要はありません。たとえば、Steamは非標準の場所からlaunchctlサービスをロードします。

➜ 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

幸い、その方法はあまり人気がないので、通常は標準の場所を検索するだけで十分です。

しかし、それは最も難しいことではありません。詳細はわかりませんが、対応するplistファイルがなくてもlaunchctlサービスをロードできるようです。たとえば、これはdumpstateが1Passwordヘルパーデーモンに対して言っていることです。

➜ 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

「smdによって送信された」が実際に何を意味するのかわかりませんが、launchctl listにヘルパーが表示されていても、ファイルシステムにplistがない可能性があります。このため、アンロードにはplistパスが必要なため、このサービスをlaunchctl unloadする方法がわかりません。また、このプロセスはlaunchdによって管理されているため、pkill -9 onepassword7-helperであっても、launchdはプロセスが停止したことを確認し、すぐに再開します。

(幸い、この特定の1Passwordの例では、Quit1Passwordをクリックするときに^を押したままにすると、特別な「Quite 1PasswordCompletely」オプションが表示されます)

0
Chris