4

Mac OSX 10.6 マシンのログイン コンテキストで実行される起動デーモンがあります。そのエージェントからユーザーごとにエージェントを起動し、ユーザーのログイン コンテキストでエージェントを実行したいと考えています。ただし、エージェント アプリケーションへの正確な引数を非常に慎重に制御する必要があるため、デーモンのように launchd エージェントを使用することはできません。

ログインしたユーザーのコンテキストで実行されるプロセスを作成するにはどうすればよいですか? trueseteuidsetuid呼び出しを行いましたが、これらはエージェント アプリケーションの実行コンテキストを変更しません。

これが Apple の推奨するやり方ではないことは承知していますが、私には選択の余地がありません。デーモン アプリケーションの設計は非常に柔軟性がありません (多くの異なるシステムで実行する必要があります)。ログイン コンテキストで実行されているデーモンから、ログイン ユーザーの GUI コンテキストでアプリケーションを実行できるようにする回避策はありますか?

私は C++、Carbon & Cocoa を使用しています。

4

1 に答える 1

1

launchd エージェントを使用します。他のすべての方法は、役に立たない詳細と隠されたトリックであなたの心を吹き飛ばします. 一般に、これは非常に複雑なタスクであり、多くのコーナー ケースがあり、適切に実装するのは非常に困難です。Launchd エージェントを使用すると、タスクに集中して多くの時間を節約できます。

最善の解決策は、コマンド ラインを使用しないようにエージェントを書き直して、launchd デーモンに接続し、適切なオプション/設定を要求することです。

それが不可能または困難な場合は、開始時にデーモンに接続するラッパー launchd エージェントを作成し、オプションを要求してから、適切なコマンド ラインで元のエージェントを起動することができます。

「デーモンへの接続」機構を実装するのが難しすぎると思われる場合は...おそらくそうですが、デーモンから他のセッションでエージェントを起動するよりもはるかに簡単です(さまざまなコーナーケースのサポートで正しく実装されている場合)。

しかし、本当にどうでもいいことなら、「launchctl bsexec」で遊ぶことができます。動作する例: GUI セッションを使用するすべてのユーザーに対して launchd エージェントを開始/停止します(「launchctl load」の代わりに、セッション コンテキストで任意の実行可能ファイルを起動できます)。

これに関するいくつかの更新。

「launchctl bsexec で遊ぶ」とは、次のような意味です。

ps aux | grep loginwindow | grep user | awk '{ system("sudo launchctl bsexec "$2" sudo -u user /Applications/TextEdit.app/Contents/MacOS/TextEdit") }'

必要なセッションでアプリを見つけ、その PID を取得して「launchctl bsexec」を呼び出して、同じセッションで必要なものを実行します。上記の例は、ログオンした「ユーザー」セッションで TextEdit を起動します。たとえその行が別のログオン ユーザー アカウントで、またはサービスから実行されたとしてもです。

しかし、Lion でテストしましたが、動作しません。私にとっては、ヒョウ(10.5 / 10.6)でのみ機能します。私が言おうとしたことは、起動エージェントを使用しないと、お尻に絶え間ない痛みが生じるだけで、他には何もないということです. そのようなことを数十回行った後、私たちは完全に起動エージェントに切り替え、今では満足しています:)

于 2011-07-04T08:16:40.070 に答える