セッションレベルのGUIエージェントをルートレベルのデーモンから起動または停止できる必要があります。GUIセッションを持つすべてのユーザーの起動エージェントの起動/停止
同様の問題については、here,hereおよびhereと記載されています。私が行うことができるようにしたいどのような
は基本的に
for num in `ps ax | grep [s]bin/launchd | cut -c 1-5`;
do
if [ $num -ne 1 ];
then
sudo launchctl bsexec $num launchctl (un)load -S Aqua /Library/LaunchAgents/com.mycompany.mydaemon.plist;
fi;
done
ですが、これだけ開始/ 1インスタンスを停止し、それが現在のGUIセッションでrootとして実行されます。私はオフにそこにsudoを残した場合、私は
task_for_pid() (os/kern) failure
Couldn't switch to new bootstrap port: (ipc/send) invalid port right
を取得開始私は(コマンドをロード/アンロードでbsexecから二次スクリプトを呼び出す含む)bsexecの他の順列の様々ないじり試してみたが、私はすることができますインスタンスをroot以外のものとして起動することは決してありません。別のGUIセッションでは使用しないでください。
また、私はsu - <user> ...
とsudo -u <user> ...
を使いこなそうとしましたが、そこには運がありませんでした(多くの人が上記のリンクされた記事や他の場所で議論しています)。
誰にも考えがありますか?
EDIT: グラハム・リーによって、以下の提案として、私はラッパーツールでこれをやってみましたが、私は次のエラーを取得する:
launch_msg(): Socket is not connected
これは、私は、コマンドラインコマンド、ラッパー、およびスクリプトです用いた(501は、別のユーザのユーザIDと63093のlaunchdのPIDがシステムにログインしている):
コマンドライン:
sudo launchctl bsexec 63093 /path/TestSetUIDAndExecuteTool 501 /path/LoadBillingDialogAgent
ラッパー:
#import <Foundation/Foundation.h>
int main (int argc, const char * argv[]) {
NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init];
if (argc != 3) {
NSLog(@"Tool called with improper arguments");
return -1;
}
int uid = [[NSString stringWithUTF8String:argv[1]] intValue];
// TODO: REMOVE
NSLog(@"Setting uid to |%i|", uid);
setuid(uid);
// TODO: REMOVE
char *command = (char *)argv[2];
NSLog(@"Executing command |%s|", command);
system(command);
[pool drain];
return 0;
}
スクリプト:
/bin/launchctl load -S Aqua /Library/LaunchAgents/com.company.agent.plist
私は 'launch_msg():ソケットが接続されていません 'というエラーが表示されます –
私はUIDをcorrentの方法で削除していますか? –
実際、私はこれを考え出しました。私が設定したテスト環境は、本当のルートレベルのデーモンと全く同じではないようです。助けてくれてありがとう。 –