2010-03-25 30 views
4

我有一个启动守护进程,它在Mac OSX 10.6机器的登录环境中运行。我想为该代理中的每个用户启动代理,并让代理在用户的登录上下文中运行。但是,我需要非常仔细地控制代理应用程序的精确参数,这就是为什么我不能使用launchd代理,就像我守护进程一样。从用户环境中的守护进程启动代理

如何创建一个在登录用户上下文中运行的进程?我已经修理了seteuidsetuid调用,但这些不会更改代理应用程序的执行上下文。

我知道这不是Apple推荐的做事方式,但我并没有真正的选择 - 守护程序的设计非常不灵活(它必须运行许多不同的系统)。有没有一种解决方法可以让我在登录用户的GUI上下文中运行一个应用程序,该应用程序来自登录上下文中运行的守护程序?

我正在使用C++,Carbon & Cocoa。

回答

0

使用launchd代理。所有其他方式都会让你的脑海里充满无数细节和隐藏的技巧。一般来说,这是非常复杂的任务,很多角落案例很难正确实施。启动代理将允许您专注于自己的任务并节省大量时间。

最好的解决方案是重写代理不要使用命令行,而是连接到launchd守护进程并要求正确的选项/设置。

如果不可能或很难,您可以编写包装程序launchd代理程序,该代理程序将在开始连接到守护程序时请求选项,然后使用适当的命令行启动原始代理程序。

如果您认为实现“连接到守护进程”机制太困难......也许是这样,但它比从守护进程启动其他会话中的代理要容易得多(当实施正确的不同角落支持时) 。

但是,如果你真的没有什么事情要肮脏的话,你可以玩“launchctl bsexec”。一些工作示例: Starting/stopping a launchd agent for all users with GUI sessions(而不是“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,即使该行在另一个登录用户帐户或服务中执行。

但我在狮子上测试它 - 它不起作用。它对我来说只适用于豹(10.5/10.6)。 我试图说 - 不使用启动代理将导致你的屁股不断痛苦,没有别的。经过十多次这样的事情后,我们开始转向发射代理,现在很高兴:)

+0

您可以评论您做了什么以完全切换到启动代理?因为我使用的是我想在安装后启动的启动代理程序,但安装(特别是postflight脚本)以root用户身份运行。按照您的说法,bsexec角度用于启动启动代理,但不在Lion中。如何让您的启动代理首先作为登录的每个用户进行启动? – devguydavid 2011-07-21 04:31:52

+0

ps aux | grep loginwindow.app | grep -v grep | awk'{system(“sudo launchctl bsexec”$ 2“sudo -u”$ 1“launchctl load -S Aqua /Library/LaunchAgents/com.my.agent.plist”)}' – 2011-08-05 17:33:08

+0

但是如果你想在Lion上有问题展示一些用户界面。我们还没有解决。 – 2011-08-05 17:34:19