5

LaunchDaemon があります。実行すると、SIMBL がインストールされているかどうかがチェックされます。SIMBL がインストールされていない場合は、NSTask を使用して SIMBL.pkg で /usr/sbin/installer を実行します。

次に、SIMBL の postflight スクリプトは、launchctl load コマンドを実行して、SIMBL の LaunchAgent をすぐに開始しようとします。

sudo -u "$USER" -- /bin/launchctl load -F -S Aqua -D user "${LAUNCHD_PLIST}"

私の LaunchDaemon の NSTask 環境には $USER が設定されていないため、これは失敗します。

システム構成フレームワークを使用してデーモンに現在のユーザーを検出させ、それを setEnvironment を使用して NSTask に渡すと、launchctl でバグが発生します。

Bug: launchctl.c:2325 (23930):13: (dbfd = open(g_job_overrides_db_path, O_RDONLY | O_EXLOCK | O_CREAT, S_IRUSR | S_IWUSR)) != -1

定義上、デーモンはユーザーセッションで動作してはならないことを認識しています。同様に、Apple は LaunchAgents を LaunchDaemons のヘルパー オブジェクトとして推奨しているようで、そのユーザー セッションの作業を行います。そのようなエージェントをすぐに稼働させる方法はありますか?

私はすべての .plist を適切な場所に置いています (再起動後に起動し、次回 launchctl が通常の読み込みを行うときに)、最初に考えたのは、launchctl にリロードするように指示することでした。ただし、これを行うコードはすべて launchctl.c でコメントアウトされています

//  { "reload",         reload_cmd,             "Reload configuration files and/or directories" },

...

 * In later versions of launchd, I hope to load everything in the first pass,
 * then do the Bonjour magic on the jobs that need it, and reload them, but for now,
 * I haven't thought through the various complexities of reloading jobs, and therefore
 * launchd doesn't have reload support right now.
4

1 に答える 1

6

ああ、どうしてlaunchd私を夢中にさせるのか……。

追いかけるために、多くの研究と実験の後、これは私が10.5+でそれを行う方法です:

# If possible, tell launchd to start the LaunchAgent. This will fail on 10.4.
# $F[0] is the pid
# $F[1] is the username
# $F[2] is the first word of the command
ps -ww -A -opid,user,command | \
  perl -nae 'if($F[2] =~ /\bloginwindow\b/) { system(
    qq(launchctl bsexec $F[0] su $F[1] -c "launchctl load -w <your_plist>"))
}'

10.4でこれを直接達成する方法は見つかりませんでした。私は10.4をごまかして、LaunchAgentが実行するであろうものを実行します。GUIがあり、それを実行できないはずです(とにかく、10.4〜10.6で実行できますが、10.7では実行できません)。10.4では、LaunchAgentは次の再起動後に正しく機能します。

上記のコードは、loginwindowプロセスを検索しbsexec、それらのコンテキストでコマンドを実行するために使用します。高速ユーザー切り替えでは、複数のコンテキストが存在する可能性があることに注意してください。

いくつかの便利なリンク:

IMOlaunchdは、Appleがこれまでに展開した中で最悪の「素晴らしいアイデア」の1つです。このアイデアは非常に便利ですが、APIはひどいものです。

于 2011-10-25T22:04:07.547 に答える