使用启动代理。所有其他方式都会有大量无用的细节和隐藏的技巧让你大吃一惊。一般来说,这是一个非常复杂的任务,有很多极端情况,很难正确实施。 Launchd 代理将让您专注于您的任务并节省大量时间。
最适合您的解决方案是重写代理不使用命令行,而是连接到 launchd 守护程序并要求正确的选项/设置。
如果不可能或很难,您可以编写包装器 launchd 代理,该代理将在启动时连接到守护程序,询问选项,然后使用正确的命令行启动原始代理。
如果您认为实现“连接到守护进程”机制太难......也许是这样,但它比从守护进程在其他会话中启动代理要容易得多(当在不同的极端情况支持下正确实现时)。
但如果你真的-真的-无论如何-想要以肮脏的方式得到它,你可以使用“launchctl bsexec”。一些有效的例子:使用 GUI 会话为所有用户启动/停止 launchd 代理 https://stackoverflow.com/questions/1106638/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 上测试了它 - 它不起作用。对我来说,它仅适用于 Leopard(10.5 / 10.6)。
这就是我想说的——不使用发射剂只会让你的屁股持续疼痛,仅此而已。经过十几次这样的事情之后,我们完全转向了启动代理,现在很高兴:)