達成したいことは可能ですが困難です。適切なユーザーセッション内でアプリケーションを起動する必要があります。セキュリティ上の理由から、ユーザーセッションの分割を越えることは困難です。
リクエストをリッスンし、代わりにアプリケーションを起動するには、他のユーザーのセッションで既に実行されているプロセスが必要です。
launchdのbsexec
ありがたいことに、最近のバージョンにlaunchd
はこの機能があります。Appleのエンジニアは一般的な使用を推奨していません。launchctlのbsexec
オプションを使用して、適切なユーザーセッションをターゲットにします。
bslist [PID | ..] [-j]
This prints out Mach bootstrap services and their respective states. While the namespace
appears flat, it is in fact hierarchical, thus allowing for certain services to be only avail-
able to a subset of processes. The three states a service can be in are active ("A"), inactive
("I") and on-demand ("D").
If [PID] is specified, print the Mach bootstrap services available to that PID. If [..] is
specified, print the Mach bootstrap services available in the parent of the current bootstrap.
Note that in Mac OS X v10.6, the per-user Mach bootstrap namespace is flat, so you will only
see a different set of services in a per-user bootstrap if you are in an explicitly-created
bootstrap subset.
If [-j] is specified, each service name will be followed by the name of the job which regis-
tered it.
bsexec PID command [args]
This executes the given command in the same Mach bootstrap namespace hierachy as the given
PID.
bstree [-j]
This prints a hierarchical view of the entire Mach bootstrap tree. If [-j] is specified, each
service name will be followed by the name of the job which registered it. Requires root priv-
ileges.
推奨されるアプローチは、launchdジョブチケットを作成してMacを再起動するか、ユーザーにログアウトして再度ログインするように依頼することです。
問題の原因
問題は、アプリケーションが間違ったWindowServer
プロセスに接続されていることに起因します。各ユーザーセッションには個別のWindowServerがあります。このプロセスは、ユーザーインターフェイスを処理します。以前の方法では、プロセスの所有権を適切なユーザーに設定しますが、独自のWindowServerプロセスに接続します。
この問題は、AppleのDaemons and Agentsテクニカルノートに記載されています。
経験
これは個人的な経験から知っています。Power Managerの場合、各ユーザーセッション内に存在するpmuserを作成しました。pmuser
デーモンをリッスンし、ユーザーごとの起動とコマンドを処理します。デーモンがルート権限を持っているにもかかわらず、ユーザーセッション内で確実に動作するためにユーザーごとのプロセスが必要でした。
open
を使用してコマンドを試しましたSSH
か?