2011-10-25 30 views
5

私はLaunchDaemonを持っています。実行時にSIMBLがインストールされているかどうかを確認します。 SIMBLがインストールされていない場合は、NSTaskを使用してSIMBL.pkgに/ usr/sbin/installerを実行します。私LaunchDaemonのNSTask環境が$ USERが設定されていないので、コードがLaunchDaemonとして実行されているときに、再起動せずに初めてLaunchAgentを起動する方法はありますか?

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

これは失敗します。

SIMBLの飛行後スクリプトスクリプトは、その後すぐにSIMBLのLaunchAgentを開始するためにlaunchctl loadコマンドを実行しようとします。

私は私のデーモンは、System Configurationフレームワークを持つ現在のユーザを検出し、私に、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に再ロードを指示することでした。しかしall the code to do that is commented out in 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. 

答えて

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を使用してこれらのコンテキストでコマンドを実行します。 Fast User Switchingでは、複数のコンテキストが存在する可能性があることに注意してください。

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

  • Daemons and Services Programming Guide。あなたはそれを読まなければなりませんが、本当に難しい質問には答えません。しかし、それは少なくともあなたにすべてがある場所のヒントを与えるでしょう。
  • TN2083。これは答えが多いほど多くの質問を提起する悲惨な文書ですが、launchdの深淵に入る人のための福音と義務的な読書です。
  • Starting/stopping a launchd agent for all users with GUI sessions。これには他にもいくつかの便利なリンクと説明があります。

IMO、launchdは、Appleが今までに展開した最悪の「素晴らしいアイデア」の1つです。このアイデアは非常に便利ですが、APIは恐ろしいものです。

+1

OS Xの「El Capitan」10.11(15A204h)では、「launchctl bsexec」がもう動作しないようです。このステップが必要な理由はありますか? – yairchu

+1

これは、正しいコンテキストでエージェントを再起動する部分です。それがなければ、あなたはOPが要求したときに再起動しません。私は10.11でこれが可能なのかどうかわかりません(もしあれば)。 –

+0

は10.11でそれを行う方法があるようです: 'launchctl bootstrap gui/\' stat -f%u \ '<あなたのエージェントのplistファイルパス>'。 http://stackoverflow.com/questions/1106638/starting-stopping-a-launchd-agent-for-all-users-with-gui-sessions#comment51143118_31534614 – yairchu

関連する問題