Launchctlコマンドにロードされている.plistファイルの場所を知ることは可能ですか?
ラベル名は「launchctllist」でリストされており、その内容は「launchctl list LABEL」で表示できますが、.plistファイルの場所が見つかりません。
/ Library/LaunchAgentまたは〜/ Library/LaunchAgentなどに配置されることはわかっていますが、launchctlコマンドですべてのジョブが一覧表示されている間は、パスを検索したくありません。
この問題は頻繁に発生しますが、残念ながらlocate
とmdfind
はどちらもシステム上の適切なディレクトリからの結果を表示しません。次の関数を.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以降(以前のバージョンについては不明)、次を呼び出すことができます:_launchctl dumpstate
_そして、実行中のすべてのプロセスに関する豊富な情報を取得します
その仕事に関連する情報の最初の行として_<LABEL> = {
_を探します
これは、すべてのアクティブなデーモンとそのplistパスを取得するための1つのライナーです。
grep -B 1 -A 1 "active count = 1$" <<< "$(launchctl dumpstate)"
launchctl list
で使用されるプロセス名は、plistで宣言されています。 plistは上記の場所にあるはずですが、ほとんどどこにでも置くことができます。
私が探していたplistを見つけました。 org.postgresql.postgresを探していましたlocate *.plist | grep org.postgresql.postgres
それを4つのファイルに絞り込みました
ロードされたすべての_.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
でフィルタリングします。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
この質問には答えがないかもしれません! 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」オプションが表示されます)