在用户上下文中从守护程序启动代理程序

时间:2010-03-25 12:15:56

标签: c++ macos daemon user-agent launchd

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

如何创建在登录用户的上下文中运行的进程?我已经完成了seteuidsetuid次调用,但这些调用并没有改变代理应用程序的执行上下文。

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

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

1 个答案:

答案 0 :(得分:0)

使用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,即使该行在另一个登录的用户帐户或服务下执行。

但是我在Lion上测试了它 - 它不起作用。它适用于我的Leopards(10.5 / 10.6)。 我试图说 - 不使用发射剂将导致你的屁股不断的痛苦,没有别的。经过十几次这样的事情,我们在发射代理上彻底改变了,现在很高兴:)