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.